Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
61 commits
Select commit Hold shift + click to select a range
e6c90bb
Polish community rail and mobile pairing (#2972)
klopez4212 Jul 26, 2026
1a56b7c
feat(mobile): add worktree-aware debug identities (#2858)
tellaho Jul 26, 2026
5d8ede4
feat(agents): lower default agent parallelism from 24 to 10 (#3038)
tlongwell-block Jul 26, 2026
871a3b3
Refine mobile community switching and discovery (#2967)
klopez4212 Jul 26, 2026
aee6314
fix(desktop): strip legacy baked team instructions from stored prompt…
wpfleger96 Jul 26, 2026
16d4ec3
feat(desktop): use collective mesh routing for Auto (#2825)
micspiral Jul 26, 2026
95fdf97
feat(acp): bring your own harness (BYOH) — generic ACP runtime seam +…
wpfleger96 Jul 27, 2026
63c62fc
chore(deps): update dependency @tanstack/react-virtual to v3.14.8 (#3…
renovate[bot] Jul 27, 2026
070fb6a
chore(deps): update radix-ui-primitives monorepo (#3063)
renovate[bot] Jul 27, 2026
afb272b
fix(desktop): render rich project work item content (#3100)
thomaspblock Jul 27, 2026
3742076
fix(mobile): mitigate message-post delay with optimistic rendering (#…
brow Jul 27, 2026
7fc0cc8
Restore Goose and Buzz Agent to onboarding harness selection (#2731)
morgmart Jul 27, 2026
87b3fcd
fix(desktop): clarify identity key button when key exists (#2357)
Chessing234 Jul 27, 2026
c5c4f39
feat(desktop): handle project work from Inbox (#3117)
thomaspblock Jul 27, 2026
00ecf2c
fix(security): authorize kind:9000 role changes in both directions (#…
tlongwell-block Jul 27, 2026
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
9b4aa8c
Merge Buzz v0.5.0 into MAC Workspace (COS-710)
marccopson Jul 28, 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
9 changes: 8 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 Down Expand Up @@ -110,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
9 changes: 7 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,9 @@ jobs:
- 'rust-toolchain.toml'
- 'deny.toml'
- '.github/workflows/ci.yml'
- '.github/workflows/docker.yml'
- 'scripts/run-tests.sh'
- 'scripts/test-docker-tag-matrix.sh'
- 'justfile'
desktop:
- 'desktop/**'
Expand Down Expand Up @@ -76,6 +78,8 @@ jobs:
scripts/test-mobile-release-candidate-publisher.sh
- name: Mobile worktree identity contract
run: scripts/test-mobile-worktree-overrides.sh
- name: Docker tag matrix contract
run: scripts/test-docker-tag-matrix.sh

rust-lint:
name: Rust Lint
Expand Down Expand Up @@ -340,6 +344,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 +676,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
89 changes: 71 additions & 18 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 MAC Workspace relay image as ghcr.io/marccopson/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 @@ -14,9 +16,11 @@ name: Docker image
# the relay image version tracks crates/buzz-relay/Cargo.toml, never desktop.
#
# Triggers:
# - push to main or mac → :<branch> + :sha-<40>
# - push to main or mac → :<branch> + :sha-<40>
# + :debug-<branch> + :debug-sha-<40>
# - 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' && 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,13 +270,32 @@ 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=raw,value=sha-${{ github.sha }},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 }}

- name: Verify debug branch tag matrix
if: matrix.variant == 'debug' && github.ref_type == 'branch'
env:
IMAGE_NAME: ${{ env.IMAGE_NAME }}
META_TAGS: ${{ steps.meta.outputs.tags }}
run: |
set -euo pipefail
expected_branch="${IMAGE_NAME}:debug-${GITHUB_REF_NAME}"
expected_sha="${IMAGE_NAME}:debug-sha-${GITHUB_SHA}"
grep -Fxq "$expected_branch" <<< "$META_TAGS"
grep -Fxq "$expected_sha" <<< "$META_TAGS"
if grep -Fq "${IMAGE_NAME}:debug-debug-" <<< "$META_TAGS"; then
echo "debug tag prefix was applied twice" >&2
exit 1
fi

- name: Create and push manifest list
id: manifest
working-directory: /tmp/digests
Expand Down Expand Up @@ -284,11 +336,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