Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
145 commits
Select commit Hold shift + click to select a range
52d13ef
fix(buzz-db): delete workflow and membership children explicitly (#8212)
TheSentinel454 Oct 14, 2026
8bb49a1
feat(relay): publish channel type and creator on every channel-state …
loganj Oct 14, 2026
d25384a
buzz-db: admit every fenced-table writer in app code (#8219)
TheSentinel454 Oct 14, 2026
67c4fe5
fix(deps): bump rustls to 0.23.46 for RUSTSEC-2026-0346 and -0347 (#8…
loganj Oct 14, 2026
e68977f
docs: link the Buzz feedback community and @buzzdotxyz on X (#8324)
ngthuydiem Oct 14, 2026
99c5fc8
ci(docker): publish qualified, sortable push gateway main tags (#8305)
TheSentinel454 Oct 14, 2026
2270b66
test(buzz-db): drop partition scratch schemas on panic (#8293)
Areson Oct 14, 2026
ea24a3e
fix(ci): remove Detect Changed Paths timeout and deletion test race (…
loganj Oct 14, 2026
7b9551a
fix(ios): open push replies in their containing thread (#8294)
brow Oct 14, 2026
231a469
Refresh mobile message bubbles, reactions, and activity cards (#8281)
klopez4212 Oct 14, 2026
a83ea69
fix(mobile): replay native navigation state when returning Home (#8314)
klopez4212 Oct 14, 2026
b379523
fix(relay): reject unreadable write targets as missing (#8249)
wpfleger96 Oct 14, 2026
2f79374
feat(relay): channel labels (#8175)
loganj Oct 14, 2026
a3909ac
feat(relay): match label and creator filters before the page limit (#…
loganj Oct 14, 2026
71d7aa0
feat(relay): add the system channel type (#8180)
loganj Oct 14, 2026
9ade5d1
feat(mobile): write catch-up and visible-message read marks like the …
loganj Oct 15, 2026
e645918
fix(relay): match pushed-down tags by position, not containment (#8335)
wpfleger96 Oct 15, 2026
8b60dcf
feat(relay): deliver full signed events to operator listeners (#8309)
baxen Oct 15, 2026
349f566
docs(nip-ap): store agent and team config as NIP-AR artifacts (#8295)
wpfleger96 Oct 15, 2026
8222e99
fix(mobile): keep thread references consistent across push and Inbox …
brow Oct 15, 2026
7b11c61
test: fix recurring CI flakes in desktop and Postgres lanes (#8343)
wesbillman Oct 15, 2026
b77ba86
perf(mobile): cut test wall time and run mobile CI lanes in parallel …
wesbillman Oct 15, 2026
cdf03f6
feat(relay): leave system channels out of reads that do not name them…
loganj Oct 15, 2026
d28f6b2
feat(relay): let channel-state filters opt in to system channels (#8182)
loganj Oct 15, 2026
a5dfdd6
Align mobile appearance and channels with desktop (#8358)
klopez4212 Oct 15, 2026
5397ea4
fix(push): verify extended App Attest proofs with a focused owned mod…
brow Oct 15, 2026
6766174
chore(push): retire push notification database trigger (#8352)
brow Oct 15, 2026
9092950
docs(nip-ap): narrow relay support and allow offline start (#8368)
wpfleger96 Oct 15, 2026
42b395c
Polish mobile bubbles, mentions, galleries, and huddle cards (#8359)
klopez4212 Oct 15, 2026
9296660
Match mobile reply links to desktop connectors (#8362)
klopez4212 Oct 15, 2026
d61fe20
Use native UIKit scrolling for iOS photo carousels (#8361)
klopez4212 Oct 15, 2026
fea02d1
fix(ios): fetch profiles and avatars in notification extension (#8369)
brow Oct 15, 2026
cdfc38e
feat(search): add newest-first sort to bridge search (#8371)
kalvinnchau Oct 15, 2026
b1d60f9
Bring synced Solo chats and projects to mobile (#8337)
klopez4212 Oct 15, 2026
f148c0f
feat(relay): add profile search over name and display_name only (#8301)
loganj Oct 15, 2026
7852b16
fix(search): normalize profile name tiers in one place (#8334)
loganj Oct 15, 2026
66d5354
fix(mobile): split channel history batches at the relay channel cap (…
wesbillman Oct 16, 2026
d039d9a
fix(relay): confirm requested channels in one membership query (#8378)
baxen Oct 16, 2026
46159fc
fix(ios): respect app minimum in generated CocoaPods targets (#8379)
brow Oct 16, 2026
93ffc37
feat(mobile): find people by name through the relay's name-only profi…
loganj Oct 16, 2026
dff0d16
docs(nips): define agent-key assertions in NIP-FA and NIP-FI (#8384)
wpfleger96 Oct 16, 2026
c0ab789
feat(buzz-db): retire the channel-TTL trigger (#8210)
TheSentinel454 Oct 16, 2026
7396243
Use upstream C secp256k1 for native Nostr signatures (#8398)
brow Oct 16, 2026
c8ea4fb
feat(mobile): polish Home navigation and Solo workspace (#8393)
klopez4212 Oct 16, 2026
2de484b
docs(ios): document Xcode 27 development setup (#8400)
brow Oct 16, 2026
2d0f78c
feat(auth): support explicit mesh JWKS transport (#8382)
bradseiler Oct 16, 2026
2745a41
buzz-db: tolerate absent universal write-fence objects (expand) (#8322)
TheSentinel454 Oct 16, 2026
60de1db
fix(db): admit fleet sweeps per tenant instead of in-SQL fence predic…
TheSentinel454 Oct 16, 2026
d794463
fix(mobile): support DeviceHub in mobile-dev (#8404)
brow Oct 16, 2026
97e1f6a
fix(db): validate channel roster snapshots in the app writer (#8316)
TheSentinel454 Oct 16, 2026
bf8b356
Fix iOS channel crash from unbounded scroll depth (#8407)
brow Oct 16, 2026
6286a54
feat(relay): store per-community NIP-FI issuer bindings (#8372)
wpfleger96 Oct 17, 2026
a96ace4
fix(mobile perf): avoid eager emoji palette scans for prose (#8416)
brow Oct 17, 2026
3a45e87
fix(mobile): polish Inbox controls and system notices (#8423)
klopez4212 Oct 18, 2026
cf1bb8d
chore(deny): exclude buzz-mesh-smoke from cargo-deny graph (#8413)
wpfleger96 Oct 18, 2026
bc99504
fix(deps): bump negentropy to 0.5.2 for RUSTSEC-2026-0365 (#8409)
wpfleger96 Oct 18, 2026
6f67dcd
fix(desktop): bump zip to 9 for RUSTSEC-2026-0367/0368/0369 (#8412)
wpfleger96 Oct 18, 2026
3ffbfa6
feat(relay): start a channel with its members in one create (#8421)
baxen Oct 18, 2026
27b9c82
Polish mobile message layout and navigation controls (#8427)
klopez4212 Oct 18, 2026
e048f5a
fix(mobile): bound search result rendering work (#8418)
brow Oct 18, 2026
819dd79
fix(mobile): bump Flutter 3.47, resolving memory leak (#8419)
brow Oct 18, 2026
7c1a896
chore(deny): check buzz-mesh-smoke in the root graph again (#8424)
wpfleger96 Oct 18, 2026
bbb5183
feat(mobile): add swipe-to-reply message gesture (#8436)
klopez4212 Oct 18, 2026
305fb7b
fix(push-gateway): request default notification sound (#8431)
brow Oct 18, 2026
8f2c771
fix(mobile): default community push notifications to on (#8425)
brow Oct 18, 2026
30ca980
feat(release): support version-matched mobile stable branches (#8430)
brow Oct 19, 2026
3debf18
fix(ios): supply missing push notification sound at handoff (#8443)
brow Oct 19, 2026
4f1f1b5
test(mobile): remove flaky channel collection assertion (#8440)
brow Oct 19, 2026
5b433d9
feat(relay): resolve NIP-FI issuer bindings from the database (#8377)
wpfleger96 Oct 19, 2026
5730c83
fix(release): keep mobile candidates pinned as branches advance (#8454)
brow Oct 19, 2026
dc4cdc4
fix(mobile): reset community notification preferences (#8455)
brow Oct 19, 2026
af7979e
test(auth): read the clock once in NIP-FI until test (#8457)
wpfleger96 Oct 19, 2026
e73ba22
fix(desktop): release the live tail after a single scroll back to bot…
ngthuydiem Oct 19, 2026
91e7b46
fix(relay): wait for the peer's Close before dropping any WebSocket (…
wpfleger96 Oct 19, 2026
cc6336d
feat(relay): tag every membership notice with its channel type (#8406)
loganj Oct 19, 2026
b6aa553
feat(mobile): account onboarding, key recovery and hosted reconnect (…
wesbillman Oct 19, 2026
bc9e7de
fix(mobile): stop Settings rows blinking while Settings opens (#8463)
wesbillman Oct 19, 2026
db50afd
perf(mobile): load the channel list's membership-scoped reads togethe…
wesbillman Oct 19, 2026
52aa37a
perf(mobile): stop an open chat rebuilding on other channels' events …
wesbillman Oct 19, 2026
91b1cc4
perf(mobile): reuse the derived pubkey when signing auth events (#8460)
wesbillman Oct 19, 2026
dcced2c
fix(mobile): preserve saved identity lookup after enumeration fails (…
wesbillman Oct 19, 2026
139f890
fix(desktop): set window title to "Buzz" for Windows taskbar (#6317)
fatima-n09 Oct 19, 2026
3ec6327
fix(mobile): keep cached state with its community (#8349)
wesbillman Oct 19, 2026
edbfbf0
test(mobile): journey-first testing guidance and suite cleanup (#8397)
wesbillman Oct 19, 2026
6e6173a
test(buzz-db): fix two PostgreSQL-lane timing flakes (#8472)
wesbillman Oct 19, 2026
e6c56ee
fix(relay): take NIP-43 snapshot reconcile off the startup path (#8467)
TheSentinel454 Oct 20, 2026
25bcb79
fix(relay): show only legacy channel types to reads that name no chan…
loganj Oct 20, 2026
c9e35f8
fix(mobile): restore Solo chats from channel labels (#8466)
klopez4212 Oct 20, 2026
c99872f
fix(relay): delete the startup NIP-33 d_tag backfill (#8468)
TheSentinel454 Oct 20, 2026
039e1c8
feat(relay): write the NIP-43 member list in the membership transacti…
TheSentinel454 Oct 20, 2026
ca3be55
fix(relay): advance the partition catch-all by default (#8464)
Areson Oct 20, 2026
0b53fc6
test(desktop): read only the open effort menu in effort-picker e2e (#…
ngthuydiem Oct 20, 2026
5fefec6
fix(mobile): restore channel icons and align chat colors with desktop…
klopez4212 Oct 20, 2026
fcdabcf
docs(db): database target architecture and schema-change rules (#8273)
TheSentinel454 Oct 20, 2026
cdc2b12
fix(mobile): resolve DM display labels once per sort (#8488)
brow Oct 20, 2026
a5767c6
fix(sdk): reject malformed mention pubkeys before signing p tags (#6372)
holmes Oct 20, 2026
ca35114
fix(mobile): simplify and refine the quick actions menu (#8491)
klopez4212 Oct 20, 2026
8bbfe44
fix(deps): bump webpki crates for RUSTSEC-2026-0381/0382/0383 (#8499)
ngthuydiem Oct 20, 2026
a93f328
perf(mobile): retain preference crypto across reconnects (#8442)
brow Oct 20, 2026
bf4a163
fix(mobile): lazily lay out channel member groups (#8437)
brow Oct 20, 2026
93114b4
fix(mobile): lazily lay out new-DM recipients (#8435)
brow Oct 20, 2026
7e64612
feat(audio-client): accept a client request in connect (#8497)
wpfleger96 Oct 20, 2026
427488e
fix(desktop): surface a missing DATABRICKS_HOST instead of loading mo…
ngthuydiem Oct 21, 2026
76d792f
BUZZ-357: feat(cli): token-lean agent output format for event reads (…
ngoodger-block Oct 21, 2026
0768397
feat(mobile): show inline human typing and outgoing avatars (#8505)
klopez4212 Oct 21, 2026
ce3fc78
feat(ws-client): send custom headers on the WebSocket upgrade (#8159)
holmes Oct 21, 2026
4dea51f
fix(relay): scope push matches with the read path's channel rule (#8507)
loganj Oct 21, 2026
cd8a968
fix(relay): push system channel events to a lease that names them (#8…
loganj Oct 21, 2026
c37d6b8
test(relay): cover system channels in the workflows API and push matc…
loganj Oct 21, 2026
1a54eec
fix(mobile): keep token labels visible in authored Markdown links (#7…
masfour7 Oct 21, 2026
d97f6b4
feat(relay): add announce channels with a join_role setting (#8143)
loganj Oct 21, 2026
2f2f6e2
fix(db): bound every statement and the #p mention scan (#8461)
TheSentinel454 Oct 21, 2026
347ce88
fix(db): keep pgschema re-apply from dropping runtime partitions (#8487)
Areson Oct 22, 2026
e8781ca
fix(mobile): remove Browse channels from channel list (#8539)
klopez4212 Oct 22, 2026
a2d28eb
fix(relay): apply channel setting changes atomically and lock every m…
loganj Oct 22, 2026
2d289f7
BUZZ-301: Add user deletion request intake (#8496)
ravarora2 Oct 22, 2026
8260b6e
feat(mobile): group typing avatars into one animated indicator (#8543)
klopez4212 Oct 22, 2026
f7708d0
Polish mobile onboarding and profile setup (#8438)
klopez4212 Oct 22, 2026
20ba95e
fix(db): rebuild events_pkey in declared order after pgschema apply (…
Areson Oct 22, 2026
dc25198
Add project selection to new Solo chats on mobile (#8546)
klopez4212 Oct 22, 2026
016310d
docs(cli): drop private references from the agent format comment (#8508)
ngoodger-block Oct 23, 2026
9e8c9fc
fix(deps): bump ctutils to 0.4.5 for RUSTSEC-2026-0385 (#8560)
loganj Oct 23, 2026
d676c7b
fix(deps): bump p256 to 0.14 for RUSTSEC-2026-0387 (#8592)
baxen Oct 26, 2026
7ce4224
fix(mesh): expire dead peer records and instrument mesh boot (#8503)
TheSentinel454 Oct 26, 2026
4250014
Run user deletion through saved stage transitions (#8520)
ravarora2 Oct 26, 2026
4c7ba3b
docs: remove NIP-FI migration gate from release procedure (#8567)
brow Oct 26, 2026
d0dee1c
feat(relay): add several people with one kind:9000 (#8575)
baxen Oct 26, 2026
369ffa0
feat(relay): verify NIP-FI agent tokens and admit agents through owne…
wpfleger96 Oct 26, 2026
d727033
docs(memory): add core-as-index and source metadata; frame memory as …
salman1993 Oct 26, 2026
b8b1ab5
perf(push): avoid empty push delivery claims (#8524)
brow Oct 26, 2026
d090ac2
perf(mobile): cut idle and resume sync churn (#8490)
wesbillman Oct 26, 2026
ab73cd9
perf(mobile): restore cached channels before community sync (#8580)
wesbillman Oct 26, 2026
a3a47e6
feat(relay): add an unlisted channel setting (#8579)
baxen Oct 26, 2026
0e36dbc
fix(db): keep the reader pool warm and drop its pre-acquire ping (#8495)
TheSentinel454 Oct 26, 2026
209fcd2
fix(mobile): ignore unrelated mutes when building push subscriptions …
morgmart Oct 26, 2026
8ceca8a
perf(mobile): batch initial channel read-state seeds (#8607)
wesbillman Oct 26, 2026
834dca2
Generate user community inventory for the dummy deletion workflow (#8…
ravarora2 Oct 26, 2026
a38fedb
fix(desktop): recognize agents without NIP-OA in Huddles (#8544)
loganj Oct 26, 2026
8216db1
chore(toolchain): bump Rust to 1.98.1 for macOS 27 proc-macro loading…
matt2e Oct 26, 2026
5996e5d
fix(mobile): isolate push setup failures from app rendering (#8610)
brow Oct 27, 2026
6861e18
fix(desktop): keep FileCard inside narrow message rows (#8612)
matt2e Oct 27, 2026
e6b7e34
Merge upstream block/buzz 6861e18a8 (141 commits) for Bishop Phase U
QuicksilverSlick Oct 27, 2026
a25fe03
fix(desktop): satisfy clippy::some_filter in bench scoped tests
QuicksilverSlick Oct 27, 2026
292f7fe
chore(deny): drop the unused RUSTSEC-2026-0381 ignore
QuicksilverSlick Oct 27, 2026
3118d66
test(desktop): wait for the step body before filling workflow message…
QuicksilverSlick Oct 27, 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
  •  
  •  
  •  
4 changes: 4 additions & 0 deletions .config/nextest.toml
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,10 @@ max-threads = 1
[[profile.postgres-ci.overrides]]
filter = "test(/cluster_global_/)"
test-group = "postgres-cluster-global"
# The group only serializes these tests with each other. They read unfiltered,
# cluster-wide `pg_stat_activity`, so any overlapping test's session can mask
# activity; claim every worker so they run alone.
threads-required = "num-test-threads"

[[profile.postgres-ci.scripts]]
# Script filters are separate from default-filter: they attach the setup and
Expand Down
45 changes: 33 additions & 12 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -52,25 +52,30 @@ REDIS_URL=redis://localhost:6379
# Emergency kill switch for all automatic partition DDL, including catch-all
# advancement; audits remain enabled.
# BUZZ_PARTITION_MANAGER_CREATE_ENABLED=true
# Opt in to replacing an empty partition catch-all with six months of dedicated
# monthlies, at startup and on every audit interval (default false). Has no
# effect while the kill switch above is off.
# BUZZ_PARTITION_MANAGER_ADVANCE_ENABLED=false
# Replace an empty partition catch-all with six months of dedicated monthlies,
# at startup and on every audit interval (default true). Has no effect while the
# kill switch above is off.
# BUZZ_PARTITION_MANAGER_ADVANCE_ENABLED=true

# Writer-session Postgres timeouts for buzz-db-backed pools and the relay audit
# pool, all in milliseconds; 0 disables. The separately deployed push gateway
# owns its own database and session policy and does not consume these knobs.
# pool, all in milliseconds; 0 disables the lock and idle timeouts. The
# separately deployed push gateway owns its own database and session policy
# and does not consume these knobs.
# lock_timeout: fail a statement that waits this long on any lock instead of
# parking behind a wedged holder (default 5000).
# BUZZ_DB_LOCK_TIMEOUT_MS=5000
# idle_in_transaction_session_timeout: reap sessions idle inside an open
# transaction — bounds how long a wedged client can hold locks (default 60000).
# BUZZ_DB_IDLE_TXN_TIMEOUT_MS=60000
# statement_timeout: cap any single statement's runtime. Off by default —
# startup migrations/backfills legitimately run long statements. Warning: a
# pathologically low value (e.g. 1) also times out connection setup and can
# prevent any DB connection from establishing.
# BUZZ_DB_STATEMENT_TIMEOUT_MS=0
# statement_timeout: cap any single statement's runtime (default 120000). A
# session cannot disable it: 0 or anything above 300000 installs 300000 (5
# minutes) and logs a warning at startup. Migrations, schema destruction, and
# community-deletion inventory and purge transactions lift it for themselves.
# Generic event reads (REQ history, /query, /count) and read-replica sessions
# are further capped at 20s. Warning: a pathologically low value (e.g. 1) also
# times out connection setup and can prevent any DB connection from
# establishing.
# BUZZ_DB_STATEMENT_TIMEOUT_MS=120000

# -----------------------------------------------------------------------------
# Typesense (search)
Expand Down Expand Up @@ -151,7 +156,8 @@ BUZZ_PUSH_GATEWAY_DELIVERY_URL=https://push.buzz.xyz/v1/deliveries/apns
# Deployment-global operator-listener routes. Each configured Nostr identity
# may register target pubkeys and receives mention notifications at its URL.
# URLs may use HTTP or HTTPS. Use HTTP only for operator-controlled internal
# connections: NIP-98 signs requests.
# connections: NIP-98 signs requests but does not encrypt them, and
# notifications carry full message content.
# Format: pubkey:deliveryUrl;pubkey:deliveryUrl
# BUZZ_OPERATOR_LISTENER_TIMEOUT_MS=5000
# BUZZ_OPERATOR_LISTENERS=<64-char hex pubkey>:https://listener.example/mentions
Expand Down Expand Up @@ -371,3 +377,18 @@ RUST_LOG=buzz_relay=debug,buzz_datastore=info,buzz_db=debug,buzz_auth=debug,buzz
# BUZZ_TERMS_OF_SERVICE_MARKDOWN="# Terms of Service\n\nFull terms here."
# BUZZ_PRIVACY_POLICY_MARKDOWN="# Privacy Policy\n\nFull policy here."
# BUZZ_AGE_ATTESTATION_REQUIRED=true

# ── NIP-FI database community source ─────────────────────────────────────────
# Where NIP-FI communities come from: "env" (BUZZ_NIP_FI_COMMUNITIES, default)
# or "database" (bindings created by provisioning; needs
# BUZZ_NIP_FI_PROVISION_BINDING and must not be combined with
# BUZZ_NIP_FI_COMMUNITIES). See docs/operator-nip-fi-bindings.md.
# BUZZ_NIP_FI_COMMUNITY_SOURCE=env
# Most community-issuer rows one snapshot may hold (1..=10000000).
# BUZZ_NIP_FI_SNAPSHOT_MAX_ROWS=1000000
# Snapshot load timeout in ms; must be under the 30s refresh interval.
# BUZZ_NIP_FI_SNAPSHOT_REFRESH_TIMEOUT_MS=10000
# Hosts whose "not found" is cached for 5s (1..=1000000).
# BUZZ_NIP_FI_RESOLVER_NEGATIVE_CACHE_MAX=100000
# Concurrent live lookups; clamped below the database pool size.
# BUZZ_NIP_FI_RESOLVER_MAX_INFLIGHT=8
128 changes: 114 additions & 14 deletions .github/workflows/_ci-clients.yml
Original file line number Diff line number Diff line change
Expand Up @@ -57,12 +57,32 @@ jobs:
path: ${{ steps.pnpm-cache.outputs.STORE_PATH }}
key: pnpm-${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }}

# Mobile lanes run in parallel; the required check reads the combined
# matrix result. Test shards split files, so each compiles only its own.
mobile:
name: Mobile
name: Mobile (${{ matrix.name }})
runs-on: ubuntu-latest
timeout-minutes: 30
# The Dreamforge fork does not build or ship the phone app (owners use Block's store build).
# Dreamforge will publish its own phone app (plan Q8), but the fork does not build it
# yet. Drop this block/buzz guard (here and on ci.yml's mobile jobs) with slice A2.
if: inputs.lane == 'required' && github.repository == 'block/buzz' && (github.event_name == 'push' || inputs.mobile)
strategy:
fail-fast: false
matrix:
include:
- name: Checks
lane: checks
- name: Tests 1/3
lane: test
shard: 0
- name: Tests 2/3
lane: test
shard: 1
- name: Tests 3/3
lane: test
shard: 2
- name: Android
lane: android
permissions:
contents: read
steps:
Expand Down Expand Up @@ -108,47 +128,127 @@ jobs:
path: ~/.pub-cache
key: pub-${{ runner.os }}-${{ hashFiles('mobile/pubspec.lock') }}
- name: Format check
if: matrix.lane == 'checks'
run: cd mobile && dart format --output=none --set-exit-if-changed .
- name: Analyze
if: matrix.lane == 'checks'
run: cd mobile && flutter analyze
- name: Test
run: cd mobile && flutter test --dart-define=BUZZ_PUSH_GATEWAY_URL=https://push.example
if: matrix.lane == 'test'
run: /bin/bash scripts/mobile-test-shard.sh ${{ matrix.shard }} 3 --dart-define=BUZZ_PUSH_GATEWAY_URL=https://push.example
- name: Test configured authentication domains
if: matrix.lane == 'checks'
run: >-
cd mobile && flutter test
--dart-define=BUZZ_PUSH_GATEWAY_URL=https://push.example
--dart-define=BUZZ_AUTH_DOMAINS=buzz.xyz,builderlab.xyz,builderlabstaging.xyz
test/shared/auth/community_entry_requirements_test.dart
test/features/invites/invite_join_provider_test.dart
test/features/onboarding/onboarding_entry_routes_test.dart
test/shared/hosted/hosted_environment_test.dart
test/shared/hosted/self_hosted_entry_test.dart
test/features/onboarding/hosted_app_gate_environment_test.dart
test/features/onboarding/hosted_journeys_test.dart
test/features/onboarding/hosted_communities_test.dart
test/features/pairing/pairing_hosted_handoff_test.dart
- name: Test mobile without push configuration
if: matrix.lane == 'checks'
run: cd mobile && flutter test test/shared/push/push_unconfigured_build_test.dart
- name: Test mobile recipe argument forwarding
if: matrix.lane == 'checks'
run: /bin/bash scripts/test-mobile-gateway-recipes.sh
- name: Restore Gradle cache
if: matrix.lane == 'android'
uses: actions/cache/restore@caa296126883cff596d87d8935842f9db880ef25 # v5
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: gradle-${{ runner.os }}-${{ hashFiles('mobile/android/**/*.gradle*', 'mobile/android/gradle/wrapper/gradle-wrapper.properties', 'mobile/pubspec.lock') }}
restore-keys: gradle-${{ runner.os }}-
# SDK component and plugin downloads intermittently fail on hosted
# runners; retry once only for those, so real build failures still fail.
- name: Build Android debug APK
run: just mobile-build-android
if: matrix.lane == 'android'
run: |
set -o pipefail
log="$RUNNER_TEMP/android-build.log"
if ! just mobile-build-android 2>&1 | tee "$log"; then
grep -qE 'InstallFailedException|Could not (resolve|GET|download)' "$log"
just mobile-build-android
fi
- name: Test Android JVM units
if: matrix.lane == 'android'
run: cd mobile/android && ./gradlew :app:testDebugUnitTest --console=plain
- name: Save Gradle cache
if: matrix.lane == 'android' && github.event_name == 'push'
uses: actions/cache/save@caa296126883cff596d87d8935842f9db880ef25 # v5
continue-on-error: true
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: gradle-${{ runner.os }}-${{ hashFiles('mobile/android/**/*.gradle*', 'mobile/android/gradle/wrapper/gradle-wrapper.properties', 'mobile/pubspec.lock') }}

# The unsigned release build needs nothing from the native lane, so it runs
# beside it instead of after the simulator tests.
mobile-swift:
name: Mobile Swift
name: Mobile Swift (${{ matrix.name }})
runs-on: macos-latest
timeout-minutes: 30
timeout-minutes: 45
if: inputs.lane == 'mobile-swift' && inputs.mobile
strategy:
fail-fast: false
matrix:
include:
- name: Native
lane: native
- name: Release
lane: release
steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
- uses: cashapp/activate-hermit@cea9af7913204a965fd488637a8d1811bba2e616 # v1
- name: Install Flutter dependencies
run: cd mobile && flutter pub get
- name: Build
run: swift build --package-path mobile/ios/BuzzPushKit
- name: Build release
run: swift build -c release --package-path mobile/ios/BuzzPushKit
# `swift test` builds BuzzPushKit; the Release lane covers its release build.
- name: Test
if: matrix.lane == 'native'
run: swift test --package-path mobile/ios/BuzzPushKit
- name: Test native pagination geometry
if: matrix.lane == 'native'
run: /bin/bash scripts/test-mobile-pagination.sh
- name: Build complete iOS simulator app
run: cd mobile && flutter build ios --simulator --debug --no-pub
- name: Test native pagination accessibility
- name: Generate iOS build configuration
if: matrix.lane == 'native'
run: cd mobile && flutter build ios --simulator --debug --no-pub --config-only
# Build the complete simulator app and RunnerTests once, in the
# background, while the simulator boots and runs the native-control
# scripts. The build also guards Apple Silicon simulator linking (#7646).
- name: Test native controls and Runner unit tests
if: matrix.lane == 'native'
run: |
device=$(xcrun simctl create "Pagination accessibility" "iPhone 16")
device=$(xcrun simctl create "Native tests" "iPhone 16")
trap 'xcrun simctl shutdown "$device"; xcrun simctl delete "$device"' EXIT
xcode=(xcodebuild -workspace mobile/ios/Runner.xcworkspace -scheme Runner
-configuration Debug -destination "platform=iOS Simulator,id=$device"
CODE_SIGNING_ALLOWED=NO)
build_log="$RUNNER_TEMP/runner-build.log"
"${xcode[@]}" build-for-testing > "$build_log" 2>&1 &
build=$!
xcrun simctl boot "$device"
xcrun simctl bootstatus "$device" -b
/bin/bash scripts/test-mobile-pagination-accessibility.sh "$device"
/bin/bash scripts/test-mobile-carousel.sh "$device"
/bin/bash scripts/test-mobile-member-picker.sh "$device"
/bin/bash scripts/test-mobile-me-agent-accessibility.sh "$device"
if ! wait "$build"; then
cat "$build_log"
exit 1
fi
tail -n 5 "$build_log"
"${xcode[@]}" -parallel-testing-enabled NO -only-testing:RunnerTests \
test-without-building
- name: Build complete unsigned iOS release
if: matrix.lane == 'release'
run: |
/bin/bash scripts/test-mobile-gateway-recipes.sh
cd mobile && flutter build ios --release --no-codesign --no-pub
Expand Down
10 changes: 9 additions & 1 deletion .github/workflows/_ci-relay.yml
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,7 @@ jobs:
--lib \
--test e2e_event_reminder \
--test e2e_author_only_deletion \
--test e2e_existence_oracle \
--archive-file target/ci/backend-integration-tests.tar.zst
- name: Build PostgreSQL test archive
if: steps.relay-artifacts-cache.outputs.cache-hit != 'true' && matrix.artifact == 'postgres-tests'
Expand Down Expand Up @@ -581,7 +582,7 @@ jobs:
run: |
cargo nextest run \
--archive-file target/ci/backend-integration-tests.tar.zst \
-E 'binary(e2e_event_reminder) | binary(e2e_author_only_deletion)' \
-E 'binary(e2e_event_reminder) | binary(e2e_author_only_deletion) | binary(e2e_existence_oracle)' \
--run-ignored ignored-only
env:
RELAY_URL: ws://localhost:3000
Expand Down Expand Up @@ -626,6 +627,13 @@ jobs:
cargo test -p buzz-test-client --test e2e_relay invite -- --ignored --nocapture
cargo test -p buzz-test-client --test e2e_relay nip43_membership_snapshots_are_rejected -- --ignored --nocapture
cargo test -p buzz-test-client --test e2e_relay nip29_departure_wire -- --ignored --nocapture
cargo test -p buzz-test-client --test e2e_relay nip29_batch_put_user_wire -- --ignored --nocapture
cargo test -p buzz-test-client --test e2e_relay nip29_announce_channel_wire -- --ignored --nocapture
cargo test -p buzz-test-client --test e2e_relay nip29_unlisted_channel_wire -- --ignored --nocapture
cargo test -p buzz-test-client --test e2e_relay nip29_solo_share_and_convert_wire -- --ignored --nocapture
cargo test -p buzz-test-client --test e2e_relay nip29_member_raises_guest_agent -- --ignored --nocapture
cargo test -p buzz-test-client --test e2e_relay nip29_guest_is_read_only_in_normal_channel -- --ignored --nocapture
cargo test -p buzz-test-client --test e2e_relay nip29_relay_rejects_role_change_by_unprivileged_actor -- --ignored --nocapture
env:
RELAY_URL: ws://localhost:3000
GIT_CREDENTIAL_NOSTR_BIN: ${{ github.workspace }}/target/ci/git-credential-nostr
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/_ci-rust.yml
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,7 @@ jobs:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
# MSVC needs windows.h (aws-lc-sys et al.), so this runs on a real Windows
# runner — hermit, used by the Linux jobs, does not provide MSVC. The
# toolchain (1.95.0 + clippy via profile = default) comes from the
# toolchain (1.98.1 + clippy via profile = default) comes from the
# repo-root rust-toolchain.toml, which the runner's preinstalled rustup
# honors on demand; the host triple already is x86_64-pc-windows-msvc.
- uses: Swatinem/rust-cache@e18b497796c12c097a38f9edb9d0641fb99eee32
Expand Down
9 changes: 8 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,9 @@ jobs:
changes:
name: Detect Changed Paths
runs-on: ubuntu-latest
timeout-minutes: 2
# The steps take about 75 seconds, but GitHub can finish the job minutes
# after the last step. A 2-minute limit cancelled finished runs.
timeout-minutes: 10
permissions:
contents: read
pull-requests: read
Expand Down Expand Up @@ -51,6 +53,8 @@ jobs:
- '.config/nextest.toml'
- 'scripts/postgres-test-*.sh'
- 'scripts/reconcile-schema-after-pgschema.sql'
- 'scripts/repair-events-pkey.sql'
- 'scripts/start-relay-for-tests.sh'
- 'bin/pgschema'
- 'bin/.pgschema-*.pkg'
- 'scripts/check-postgres-test-discovery.py'
Expand Down Expand Up @@ -86,7 +90,10 @@ jobs:
- 'pnpm-lock.yaml'
mobile:
- 'mobile/**'
- 'Justfile'
- 'scripts/test-mobile-gateway-recipes.sh'
- 'scripts/mobile-release.sh'
- 'scripts/mobile-release-source.sh'
- 'scripts/mobile-worktree-overrides.sh'
- 'scripts/mobile-worktree-clean.sh'
- 'scripts/publish-mobile-release-candidate.sh'
Expand Down
9 changes: 8 additions & 1 deletion .github/workflows/docker.yml
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,10 @@ name: Docker image
# intact) and the bare version flows straight to the semver parser. On a
# real push event value= is empty and the match strips relay-v from the ref.
#
# ghcr.io/block/buzz-push-gateway carries the same :main, :sha-<7> and
# :main-<commit UTC>-<7> tags on main pushes, and publishes only after the
# relay's `qualify` job accepts the same source SHA.
#
# :main-<YYYYMMDDHHmmss>-<7> names the same main build as :sha-<7>, prefixed
# with its UTC commit time so the tag sorts by build order. Kargo's Lexical
# strategy picks the newest from the tag list alone; :sha-<7> cannot be
Expand Down Expand Up @@ -622,7 +626,9 @@ jobs:
name: Publish public push gateway image
if: github.event_name != 'pull_request'
runs-on: ubuntu-24.04
needs: push-gateway-build
# Staging promotes every published main gateway image automatically, so the
# gateway publishes only from a source the relay's same-SHA CI qualified.
needs: [push-gateway-build, qualify]
timeout-minutes: 15
permissions:
contents: read
Expand Down Expand Up @@ -654,6 +660,7 @@ jobs:
type=sha,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=raw,value=main-{{commit_date 'YYYYMMDDHHmmss'}}-{{sha}},enable=${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }}
- name: Merge and publish manifest
id: manifest
working-directory: /tmp/gateway-digests
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/dreamforge-desktop-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,7 @@ jobs:
persist-credentials: false
ref: ${{ needs.gate.outputs.sha }}

- uses: dtolnay/rust-toolchain@e081816240890017053eacbb1bdf337761dc5582 # 1.95.0
- uses: dtolnay/rust-toolchain@18f0487477426dce244608110aa2660c2893deb7 # 1.98.1
with:
targets: ${{ matrix.target }}

Expand Down Expand Up @@ -263,7 +263,7 @@ jobs:
persist-credentials: false
ref: ${{ needs.gate.outputs.sha }}

- uses: dtolnay/rust-toolchain@e081816240890017053eacbb1bdf337761dc5582 # 1.95.0
- uses: dtolnay/rust-toolchain@18f0487477426dce244608110aa2660c2893deb7 # 1.98.1
with:
targets: x86_64-pc-windows-msvc

Expand Down
Loading
Loading