Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
92 commits
Select commit Hold shift + click to select a range
654f384
fix(desktop): read the newest pair-scoped harness log (#3134)
wpfleger96 Jul 27, 2026
4ef5f10
docs(contributing): set PR expectations and require UI screenshots (#…
wpfleger96 Jul 27, 2026
31e2de1
fix(deps): bump nostr to 0.44.6 for RUSTSEC-2026-0216 (NIP-44 remote …
tlongwell-block Jul 27, 2026
fe84274
chore(deps): update react monorepo to v19.2.8 (#3064)
renovate[bot] Jul 27, 2026
e2e0079
fix(security): enforce durable community ban on NIP-43 relay-admin ki…
tlongwell-block Jul 27, 2026
18eef63
feat(git): use agent display name as git author name (#3040)
wpfleger96 Jul 27, 2026
68f39f3
feat(mobile): bring message actions to desktop parity (#3070)
tellaho Jul 27, 2026
f2fe3b6
feat(acp): title agent sessions from the agent and channel name (#3028)
wpfleger96 Jul 27, 2026
be275cf
fix(desktop): keep identity key help dialog readable in dark mode (#2…
pfista Jul 27, 2026
313f793
feat(desktop): add search to agent emoji picker (#2630)
TheSentinel454 Jul 27, 2026
9d36778
feat(mobile): refactor Activity behavior and ui (#2889)
tellaho Jul 27, 2026
545bb46
fix(desktop): make lint and unit-test gates work on Windows (#2943)
TheSeydiCharyyev Jul 27, 2026
8bb43d5
fix(desktop): make the test loader work on Windows (#2758)
technicallybrantley Jul 27, 2026
c3084b3
fix(cli,relay): resolve agents by verified owner (#2615)
johnmatthewtennant Jul 27, 2026
b92a1f4
chore(desktop): add AgentCreationPreview file-size override to unbloc…
wpfleger96 Jul 27, 2026
e28707f
fix(mobile): retry channel-sections startup sync when relay rate-limi…
tellaho Jul 27, 2026
32ead93
fix(mobile): tapping threaded message in Inbox navigates to top level…
brow Jul 27, 2026
8995316
fix(desktop): use forward slashes for git credential.helper on Window…
bcrdejong Jul 27, 2026
3faea98
fix(mobile): match markContextRead signature in activity test fake (#…
wpfleger96 Jul 27, 2026
d98da73
feat(desktop): redesign agent runtime settings (#3093)
tellaho Jul 27, 2026
a041e2d
Revert "fix(cli,relay): resolve agents by verified owner" (#3168)
wpfleger96 Jul 27, 2026
9b0f744
resolve findings (#3150)
tlongwell-block Jul 27, 2026
137185e
chore(deps): update plugin org.jetbrains.kotlin.android to v2.2.21 (#…
renovate[bot] Jul 27, 2026
4d8b676
fix(desktop): keep collapsed table separators out of spoilers (#3169)
wesbillman Jul 27, 2026
01c2381
Replace mobile reconnect banners with skeleton shimmer (#3143)
klopez4212 Jul 27, 2026
174c38e
fix(desktop): recover full local storage on startup (#3182)
wesbillman Jul 27, 2026
f069a85
feat(admin): show reported message content in report detail (#3149)
kalvinnchau Jul 27, 2026
75588ea
Refine pending message status (#3153)
klopez4212 Jul 27, 2026
99da5b7
Fix composer selection formatting and drop overlay (#3172)
klopez4212 Jul 27, 2026
2bd4c24
Inbox refactor (#2045)
delkc Jul 27, 2026
de13960
fix(desktop): keep project Inbox previews compact (#3193)
thomaspblock Jul 27, 2026
7ca0bbd
fix(desktop): republish agent identity records when a persona rename …
SeanGearin Jul 27, 2026
0019f80
fix(desktop): fetch join policies through native networking (#2862)
johnmatthewtennant Jul 27, 2026
cb2a265
feat(search): parse from:/in:/after:/before: and pass them in the fil…
jatinder14 Jul 27, 2026
9810d85
fix(desktop): preserve thread anchor through layout reflow (#3212)
wesbillman Jul 27, 2026
98a7b13
fix(node): bump Buzz-supplied Node runtimes past OpenClaw's >=24.15.0…
tlongwell-block Jul 27, 2026
d500c2d
feat(invites): add use-limited invite links (#3141)
kalvinnchau Jul 27, 2026
d8f9d87
Polish composer activity layout and transitions (#3151)
morgmart Jul 27, 2026
94675e0
refactor(desktop): extract install command execution into install_exe…
wpfleger96 Jul 28, 2026
be13b4b
fix(desktop): probe legacy Goose install dir on Windows (#3248)
wpfleger96 Jul 28, 2026
925a9a7
fix(buzz-acp): accept id-keyed config options when resolving model sw…
chillerno1 Jul 28, 2026
e94b9ae
feat(tracing): add datastore tracing plumbing (#2760)
ThePumpingLemma Jul 28, 2026
3a4bf51
Publish symbol-bearing debug relay images (#3250)
ThePumpingLemma Jul 28, 2026
2ce2d71
feat(relay): make Postgres pool size configurable, default 50 (#3191)
tlongwell-block Jul 28, 2026
4a977c5
chore(release): release Buzz Desktop version 0.5.0 (#3213)
wesbillman Jul 28, 2026
7dfea26
Add mobile message image galleries (#3312)
klopez4212 Jul 28, 2026
6da45ac
Polish mobile message and search layouts (#3121)
klopez4212 Jul 28, 2026
a3b0977
Refine mobile attachment picking (#3313)
klopez4212 Jul 28, 2026
af4d861
feat(chart): add relay pod extension points (#3322)
ThePumpingLemma Jul 28, 2026
5457c94
fix(composer): scope multiline block formatting (#3246)
tellaho Jul 28, 2026
60158fc
feat(cli): add users set-status command for NIP-38 profile status (#3…
kaganin Jul 28, 2026
4e3998f
fix(desktop): gate codex-acp on a minimum supported version (#3254)
wpfleger96 Jul 28, 2026
00ede2e
fix(desktop): restore the inbox icon in the sidebar (#3341)
delkc Jul 28, 2026
a772128
Unify mobile loading spinners (#3314)
klopez4212 Jul 28, 2026
35305bf
docs: restructure DCO guidance into scannable subsection (#3337)
cameronhotchkies Jul 28, 2026
3afa129
fix(desktop): keep drafts out of the Inbox All view (#3217)
thomaspblock Jul 28, 2026
a35771f
feat(desktop): refine agent catalog sharing (#2439)
klopez4212 Jul 28, 2026
5b737b8
feat(relay): serve the relay under an optional BUZZ_BASE_PATH prefix
kcao-gss Jul 28, 2026
1e307e1
chore(compose): remove stale typesense env vars (#3332)
kalvinnchau Jul 28, 2026
b0503d8
feat(desktop): add custom harness inline from agent dialogs (#3252)
wpfleger96 Jul 28, 2026
1d4f97b
fix(acp): disable goose cron scheduler in managed agent children (#3144)
wpfleger96 Jul 28, 2026
1d3b810
fix(desktop): paint community rail full height (#3382)
wesbillman Jul 28, 2026
4fcd55a
docs(contributing): document the Linux system libraries just ci requi…
kcao-gss Jul 28, 2026
913d564
fix(desktop): stabilize flaky DM expansion E2E ordering assertions (#…
cameronhotchkies Jul 28, 2026
3ece446
feat(desktop): apply WebKit rendering workarounds at startup on Linux…
wpfleger96 Jul 28, 2026
f25e6dd
feat(acp): steer claude-code and codex agents via _session/steering (…
wpfleger96 Jul 28, 2026
12d63c6
release(chart): publish 0.1.7 (#3393)
ThePumpingLemma Jul 28, 2026
826bed4
chore(ci): bump desktop smoke E2E timeout to 30 minutes (#3409)
wpfleger96 Jul 28, 2026
9227bdf
fix(ci): ratchet file sizes against the base tree (#3352)
wesbillman Jul 28, 2026
55a3ed7
fix(desktop): clear stale thread new-message pill (#3411)
wesbillman Jul 28, 2026
90e058e
feat: add explicit entry for claude-opus-5 in model config (#2831)
Apurva324 Jul 28, 2026
22be8bb
fix(relay): avoid subscription lock inversion (#3413)
tlongwell-block Jul 29, 2026
6300a6b
fix(acp): per-runtime env defaults at spawn — isolate Hermes from con…
tlongwell-block Jul 29, 2026
485d03a
Fix mobile attachment and gallery polish (#3370)
klopez4212 Jul 29, 2026
c405ad1
feat(agent): fix Anthropic prompt caching with Databricks (+ MCP prox…
atishpatel Jul 29, 2026
cb8d117
fix(desktop): accept invite URLs from a relay served under a base path
kcao-gss Jul 29, 2026
ce01e93
Polish mobile typing indicator (#3528)
klopez4212 Jul 29, 2026
24d90d1
Refine community invite limits (#3529)
klopez4212 Jul 29, 2026
6438ded
feat(agent): route Claude/GPT model families to their native gateway …
atishpatel Jul 29, 2026
4555899
Polish mobile navigation and menus (#3486)
klopez4212 Jul 29, 2026
f7a3988
fix(desktop): preserve shared agent fidelity (#3553)
wesbillman Jul 29, 2026
294c8c8
perf(desktop): move observer-feed archive and decrypt commands off ma…
wpfleger96 Jul 29, 2026
51bb97d
Run Tauri clippy in pre-push (#3555)
wesbillman Jul 29, 2026
a13085e
chore(release): release Buzz Desktop version 0.5.1 (#3566)
wesbillman Jul 29, 2026
9752b81
Serialize Tauri pre-push checks (#3567)
wesbillman Jul 29, 2026
9beb3b8
fix(cli): mask credential env values in --help output (#3570)
wpfleger96 Jul 29, 2026
4a1ebf2
feat(agent): make Gemini and MLflow-route models usable through datab…
atishpatel Jul 29, 2026
ddd4687
revert(acp): remove dead GOOSE_ACP_SCHEDULER_DISABLED env injection (…
wpfleger96 Jul 29, 2026
24f2e17
fix(relay): advertise media under the base path in upload descriptors
kcao-gss Jul 29, 2026
7e9b77f
Fix inline raster avatars in agent catalog (#3581)
wesbillman Jul 29, 2026
324bd6b
Fix shared agent avatar import profiles (#3578)
wesbillman Jul 29, 2026
90836df
Merge remote-tracking branch 'origin/main' into feat/relay-base-path
kcao-gss Jul 29, 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
  •  
  •  
  •  
14 changes: 13 additions & 1 deletion .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,10 @@ REDIS_URL=redis://localhost:6379
# Max connections in the relay's shared Redis pool (default 16).
# BUZZ_REDIS_POOL_SIZE=16

# Max connections in each of the relay's Postgres pools — writer and, when
# READ_DATABASE_URL is set, reader (default 50).
# BUZZ_DB_POOL_SIZE=50

# -----------------------------------------------------------------------------
# Typesense (search)
# -----------------------------------------------------------------------------
Expand All @@ -47,6 +51,11 @@ TYPESENSE_URL=http://localhost:8108
BUZZ_BIND_ADDR=0.0.0.0:3000
# Public WebSocket URL — used in NIP-42 auth challenges
RELAY_URL=ws://localhost:3000
# Optional URL path prefix to serve the relay under. Empty (the default) mounts
# everything at /. Set this only when a gateway routes to the relay by path
# instead of by hostname — the WebSocket then answers on ws://host/<prefix> and
# every HTTP route lives under it. RELAY_URL must include the same prefix.
# BUZZ_BASE_PATH=/relay
# Stable relay signing key. Set this in dev if you want REST-created forum posts
# to keep resolving to the original author across relay restarts.
# BUZZ_RELAY_PRIVATE_KEY=<32-byte hex private key>
Expand Down Expand Up @@ -105,7 +114,10 @@ RELAY_URL=ws://localhost:3000
# -----------------------------------------------------------------------------
# Logging / Tracing
# -----------------------------------------------------------------------------
RUST_LOG=buzz_relay=debug,buzz_db=debug,buzz_auth=debug,buzz_pubsub=debug,tower_http=debug
RUST_LOG=buzz_relay=debug,buzz_datastore=info,buzz_db=debug,buzz_auth=debug,buzz_pubsub=debug,tower_http=debug
# Optional OpenTelemetry-only target filter. This is deliberately independent
# from RUST_LOG so log verbosity changes cannot break trace parentage.
# BUZZ_OTEL_FILTER=buzz_relay=info,buzz_datastore=info

# OTLP tracing endpoint (optional — leave unset to disable)
# OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317
Expand Down
8 changes: 8 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# Git for Windows defaults to core.autocrlf=true, so without this every text
# file lands in the working copy with CRLF. Biome formats with LF
# (biome.json sets no lineEnding override), which fails `biome check` on
# effectively every file, and
# desktop/src/features/messages/ui/virtuaWheelModePatch.test.mjs asserts on
# patches/*.patch with `\n`-joined patterns. Normalize to LF in the working
# copy on every platform; the stored blobs are already LF.
* text=auto eol=lf
2 changes: 1 addition & 1 deletion .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,4 @@
<!-- Fixes #1234, or N/A. Before opening: search existing issues/PRs for duplicates — link the closest one, or say "none found". -->

### Testing
<!-- How was this verified? -->
<!-- How was this verified? UI change? Include before/after screenshots (or a short recording). -->
23 changes: 20 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -48,15 +48,21 @@ jobs:
- 'scripts/run-tests.sh'
- 'justfile'
desktop:
- 'scripts/check-file-sizes-core.mjs'
- 'scripts/check-file-sizes-core.test.mjs'
- 'desktop/**'
- '!desktop/src-tauri/**'
- 'pnpm-lock.yaml'
desktop-rust:
- 'desktop/src-tauri/**'
web:
- 'scripts/check-file-sizes-core.mjs'
- 'scripts/check-file-sizes-core.test.mjs'
- 'web/**'
- 'pnpm-lock.yaml'
mobile:
- 'scripts/check-file-sizes-core.mjs'
- 'scripts/check-file-sizes-core.test.mjs'
- 'mobile/**'
- 'scripts/mobile-release.sh'
- 'scripts/mobile-worktree-overrides.sh'
Expand All @@ -76,6 +82,8 @@ jobs:
scripts/test-mobile-release-candidate-publisher.sh
- name: Mobile worktree identity contract
run: scripts/test-mobile-worktree-overrides.sh
- name: File size ratchet unit tests
run: node --test scripts/check-file-sizes-core.test.mjs

rust-lint:
name: Rust Lint
Expand Down Expand Up @@ -130,6 +138,8 @@ jobs:
contents: read
steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
with:
fetch-depth: 2
- uses: cashapp/activate-hermit@cea9af7913204a965fd488637a8d1811bba2e616 # v1
- uses: rui314/setup-mold@9c9c13bf4c3f1adef0cc596abc155580bcb04444 # v1
- uses: Swatinem/rust-cache@e18b497796c12c097a38f9edb9d0641fb99eee32 # v2
Expand Down Expand Up @@ -213,7 +223,7 @@ jobs:
desktop-smoke-e2e:
name: Desktop Smoke E2E (${{ matrix.shard }})
runs-on: ubuntu-latest
timeout-minutes: 20
timeout-minutes: 30
needs: [changes]
if: github.event_name == 'push' || needs.changes.outputs.desktop == 'true' || needs.changes.outputs.desktop-rust == 'true' || needs.changes.outputs.rust == 'true'
strategy:
Expand Down Expand Up @@ -340,6 +350,7 @@ jobs:
cargo build --profile ci -p buzz-relay -p git-credential-nostr
cargo nextest archive \
--cargo-profile ci \
-p buzz-db \
-p buzz-relay \
-p buzz-test-client \
--lib \
Expand Down Expand Up @@ -671,11 +682,11 @@ jobs:
done
cat /tmp/buzz-relay.log
exit 1
- name: Invite claim security tests
- name: Invite security tests
run: |
cargo nextest run \
--archive-file target/ci/backend-integration-tests.tar.zst \
-E 'package(buzz-relay) and test(claim_)' \
-E '(package(buzz-db) and test(/relay_invite::tests/)) or (package(buzz-relay) and test(/api::invites::tests/))' \
--run-ignored ignored-only
env:
DATABASE_URL: postgres://buzz:${{ env.BUZZ_TEST_POSTGRES_PASSWORD }}@localhost:5432/buzz
Expand Down Expand Up @@ -750,6 +761,8 @@ jobs:
contents: read
steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
with:
fetch-depth: 2
- uses: cashapp/activate-hermit@cea9af7913204a965fd488637a8d1811bba2e616 # v1
- name: Get pnpm store directory
id: pnpm-cache
Expand Down Expand Up @@ -783,6 +796,8 @@ jobs:
contents: read
steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
with:
fetch-depth: 2
- uses: cashapp/activate-hermit@cea9af7913204a965fd488637a8d1811bba2e616 # v1
- name: Compute Hermit cache key
id: hermit-bin-hash
Expand Down Expand Up @@ -821,6 +836,8 @@ jobs:
with:
path: ~/.pub-cache
key: pub-${{ runner.os }}-${{ hashFiles('mobile/pubspec.lock') }}
- name: File size ratchet
run: node mobile/scripts/check-file-sizes.mjs
- name: Format check
run: cd mobile && dart format --output=none --set-exit-if-changed .
- name: Analyze
Expand Down
75 changes: 56 additions & 19 deletions .github/workflows/docker.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
name: Docker image

# Builds and publishes the public Buzz relay image as ghcr.io/block/buzz.
# Builds and publishes the public Buzz relay images as ghcr.io/block/buzz.
# Normal tags contain stripped binaries; matching debug-* tags contain the same
# optimized binaries with line-table debug information for native profilers.
#
# Strategy: each architecture builds on its native runner (ubuntu-24.04 for
# amd64, ubuntu-24.04-arm for arm64), pushes to GHCR by digest, then a final
Expand All @@ -15,8 +17,10 @@ name: Docker image
#
# Triggers:
# - push to main → :main + :sha-<7>
# + :debug-main + :debug-sha-<7>
# - push tags relay-v*.*.* → :{version} + :{major}.{minor} + :{major}
# (+ :latest for stable, NOT for prereleases)
# + matching :debug-* tags
# (+ :latest/:debug-latest for stable releases)
# - pull_request → build only (no push), cache stays warm
# - workflow_dispatch → manual relay-tag rescue at the tag itself
#
Expand Down Expand Up @@ -95,10 +99,6 @@ jobs:
runner: ubuntu-24.04-arm
arch: arm64

outputs:
# Used downstream by `merge` to stitch the manifest.
version: ${{ steps.meta.outputs.version }}

steps:
- name: Checkout
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
Expand Down Expand Up @@ -163,12 +163,13 @@ jobs:
org.opencontainers.image.description=WebSocket relay server for the Buzz communications platform
org.opencontainers.image.licenses=Apache-2.0

- name: Build and push by digest
id: build
- name: Build and push release image by digest
id: build-release
uses: docker/build-push-action@f9f3042f7e2789586610d6e8b85c8f03e5195baf # v7.2.0
with:
context: .
file: ./Dockerfile
target: runtime
platforms: ${{ matrix.platform }}
labels: ${{ steps.meta.outputs.labels }}
# Push by digest, not by tag — the merge job assembles the tags
Expand All @@ -180,25 +181,49 @@ jobs:
cache-to: |
${{ (github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository) && format('type=registry,ref={0}-buildcache:{1},mode=max,compression=zstd', env.IMAGE_NAME, matrix.arch) || '' }}

- name: Export digest
- name: Build and push debug image by digest
id: build-debug
uses: docker/build-push-action@f9f3042f7e2789586610d6e8b85c8f03e5195baf # v7.2.0
with:
context: .
file: ./Dockerfile
target: runtime-debug
platforms: ${{ matrix.platform }}
labels: ${{ steps.meta.outputs.labels }}
outputs: type=image,name=${{ env.IMAGE_NAME }},push-by-digest=true,name-canonical=true,push=${{ github.event_name != 'pull_request' }}
cache-from: |
type=registry,ref=${{ env.IMAGE_NAME }}-buildcache:${{ matrix.arch }}

- name: Export release and debug digests
if: github.event_name != 'pull_request'
env:
DIGEST: ${{ steps.build.outputs.digest }}
RELEASE_DIGEST: ${{ steps.build-release.outputs.digest }}
DEBUG_DIGEST: ${{ steps.build-debug.outputs.digest }}
run: |
mkdir -p /tmp/digests
touch "/tmp/digests/${DIGEST#sha256:}"
mkdir -p /tmp/digests-release /tmp/digests-debug
touch "/tmp/digests-release/${RELEASE_DIGEST#sha256:}"
touch "/tmp/digests-debug/${DEBUG_DIGEST#sha256:}"

- name: Upload digest
- name: Upload release digest
if: github.event_name != 'pull_request'
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: digests-${{ matrix.arch }}
path: /tmp/digests/*
name: digests-release-${{ matrix.arch }}
path: /tmp/digests-release/*
if-no-files-found: error
retention-days: 1

- name: Upload debug digest
if: github.event_name != 'pull_request'
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: digests-debug-${{ matrix.arch }}
path: /tmp/digests-debug/*
if-no-files-found: error
retention-days: 1

merge:
name: Merge multi-arch manifest
name: Merge ${{ matrix.variant }} multi-arch manifest
if: github.event_name != 'pull_request'
runs-on: ubuntu-24.04
needs: build
Expand All @@ -208,13 +233,21 @@ jobs:
packages: write # push the merged manifest
id-token: write # OIDC for provenance attestation on the manifest
attestations: write
strategy:
fail-fast: false
matrix:
include:
- variant: release
tag_prefix: ""
- variant: debug
tag_prefix: debug-

steps:
- name: Download all per-arch digests
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
path: /tmp/digests
pattern: digests-*
pattern: digests-${{ matrix.variant }}-*
merge-multiple: true

- name: Set up Docker Buildx
Expand All @@ -237,9 +270,12 @@ jobs:
# the build job's `meta` step for why match=^relay-v(.*)$, why
# value=${{ inputs.version }} carries the rescue-dispatch version,
# and why :latest is left to flavor.latest=auto.
flavor: |
latest=auto
prefix=${{ matrix.tag_prefix }},onlatest=true
tags: |
type=ref,event=branch,enable=${{ github.event_name != 'workflow_dispatch' || inputs.version == '' }}
type=sha,prefix=sha-,format=short,enable=${{ github.event_name != 'workflow_dispatch' || inputs.version == '' }}
type=sha,prefix=${{ matrix.tag_prefix }}sha-,format=short,enable=${{ github.event_name != 'workflow_dispatch' || inputs.version == '' }}
type=semver,pattern={{version}},match=^relay-v(.*)$,value=${{ inputs.version }}
type=semver,pattern={{major}}.{{minor}},match=^relay-v(.*)$,value=${{ inputs.version }}
type=semver,pattern={{major}},match=^relay-v(.*)$,value=${{ inputs.version }}
Expand Down Expand Up @@ -284,11 +320,12 @@ jobs:
- name: Summary
env:
IMAGE_NAME: ${{ env.IMAGE_NAME }}
VARIANT: ${{ matrix.variant }}
MERGED_DIGEST: ${{ steps.manifest.outputs.digest }}
META_TAGS: ${{ steps.meta.outputs.tags }}
run: |
{
echo "### Published \`${IMAGE_NAME}\`"
echo "### Published \`${IMAGE_NAME}\` (${VARIANT})"
echo
echo "**Digest:** \`${MERGED_DIGEST}\`"
echo
Expand Down
14 changes: 12 additions & 2 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -343,9 +343,19 @@ Add specs to `desktop/tests/e2e/` and register them in `playwright.config.ts`
(`smoke` project `testMatch`). Every test calls `installMockBridge(page)` for
mock Tauri IPC. Mock pubkey, channel names, and UUIDs live in `e2eBridge.ts`.

**Always build with `pnpm build:e2e`, never `pnpm run build`.** The mock Tauri
bridge is compiled in only for `--mode e2e` (see `installE2eBridgeIfConfigured`
in `desktop/src/main.tsx`). A plain `pnpm run build` strips it, so
`window.__TAURI_INTERNALS__` is never defined and **every** mock-mode spec fails
with `Cannot read properties of undefined (reading 'invoke')` — the app renders
"Community connection failed" instead of the UI under test. That looks exactly
like a product bug rather than a build mistake, so it burns real time.
`pnpm test:e2e:smoke` and `pnpm test:e2e:integration` run the right build for
you; prefer them over a manual build plus `playwright test`.

**Stale server:** `reuseExistingServer: true` means a previous build's server
serves old code. Kill port 4173 and `pnpm run build` before re-running tests
after code changes.
serves old code. Kill port 4173 and re-run `pnpm build:e2e` before re-running
tests after code changes.

**`addInitScript` before bridge:** `page.addInitScript` (localStorage seeding)
must run BEFORE `installMockBridge(page)` — React reads state on mount, the
Expand Down
Loading
Loading