Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
69 commits
Select commit Hold shift + click to select a range
af33072
feat(push): configure gateway origin and relay endpoint
brow Sep 2, 2026
7d7cc99
feat(push): require configured mobile and chart origins
brow Sep 2, 2026
6616b83
ci(helm): provide explicit gateway origin
brow Sep 2, 2026
4a60901
fix(push): clean up legacy enrollment state
brow Sep 2, 2026
bbc6cf3
Revert "fix(push): clean up legacy enrollment state"
brow Sep 2, 2026
f2c4ce7
docs(nip-pl): keep canonical gateway profile
brow Sep 2, 2026
aede861
fix(push): bind enrollment to relay gateway
brow Sep 2, 2026
236fd35
fix(push): preserve registered transcript audiences
brow Sep 2, 2026
38532e1
fix(push): keep gateway config off the NIP wire
brow Sep 2, 2026
a61a899
fix(mobile): reject malformed push gateway origins
brow Sep 2, 2026
86a90b6
test(mobile): cover push gateway origin validation
brow Sep 2, 2026
c5a3764
fix(push): revoke retired gateway installations
brow Sep 2, 2026
1dda5fd
fix(mobile): configure direct Xcode gateway builds
brow Sep 2, 2026
de4a26a
fix(push): revoke before replacing attest key
brow Sep 2, 2026
4922af6
docs(mobile): configure Xcode gateway build setting
brow Sep 2, 2026
711b50a
fix(push): bind cleanup to installation keys
brow Sep 2, 2026
6e8a067
fix(push): restore rollback gateway state
brow Sep 2, 2026
5925166
fix(push): clean retired gateways during registration
brow Sep 2, 2026
134b104
fix(push): retain endpoint for cleanup replay
brow Sep 2, 2026
5dc1278
fix(push): journal fresh enrollment endpoint
brow Sep 2, 2026
e99d3d5
fix(push): initialize gateway cleanup at startup
brow Sep 3, 2026
763517c
fix(push): retry startup gateway cleanup
brow Sep 3, 2026
76e31cd
fix(push): bound retired gateway retries
brow Sep 3, 2026
ce8d593
fix(push): continue retired gateway cleanup
brow Sep 3, 2026
895d5fe
fix(mobile): require HTTPS for release gateway
brow Sep 3, 2026
da10304
fix(push): reconcile restored enrollment journal
brow Sep 3, 2026
88561a9
fix(push): preserve shared installation during cleanup
brow Sep 3, 2026
2c60418
fix(mobile): reject release gateway ports
brow Sep 3, 2026
59ce830
Checkpoint retired installation cleanup
brow Sep 3, 2026
6a5c5ce
Retry ambiguous push revocation failures
brow Sep 3, 2026
c559fc6
Quarantine push grants before revocation
brow Sep 3, 2026
d283152
Reconcile committed push delegation generation
brow Sep 3, 2026
0074858
Scope push delegation generation fallback
brow Sep 3, 2026
0dff62c
Make push delegation cleanup recoverable
brow Sep 3, 2026
115f1dd
Merge remote-tracking branch 'origin/main' into configurable-push-gat…
brow Sep 3, 2026
adf2bf0
Journal shared push installation grants
brow Sep 3, 2026
39b6687
Retire grants for revoked push delegation
brow Sep 3, 2026
facee24
Checkpoint completed delegation cleanup
brow Sep 3, 2026
bb75c43
Reject ported push delivery URLs
brow Sep 3, 2026
bf39df6
Recover legacy push authority state
brow Sep 3, 2026
048e88c
Preserve configured legacy push origin
brow Sep 3, 2026
b0d0435
Wait for APNs before legacy push cleanup
brow Sep 3, 2026
9e08172
Migrate push leases before gateway cleanup
brow Sep 3, 2026
338c706
Checkpoint push migration retries
brow Sep 3, 2026
ae0bf99
Merge remote-tracking branch 'origin/main' into configurable-push-gat…
brow Sep 3, 2026
2f8ad3f
Scope push migration publication fence
brow Sep 3, 2026
239623e
Preserve push replacements across endpoint rotation
brow Sep 3, 2026
76b2e32
Distinguish same-gateway push replacements
brow Sep 3, 2026
7b874a6
Fence push cleanup against newer migration work
brow Sep 3, 2026
29779e9
Serialize push cleanup with enrollment
brow Sep 3, 2026
923544e
Disambiguate push installation conflicts
brow Sep 3, 2026
532c37d
Checkpoint completed push replacement origins
brow Sep 3, 2026
c36ba66
Fence push replacement checkpoints
brow Sep 3, 2026
44ce7fb
Confirm push lease acceptance before cleanup
brow Sep 3, 2026
c645d9c
Retain push revocation tombstones through expiry
brow Sep 3, 2026
bb75bec
Document Android push gateway input
brow Sep 3, 2026
2341ccb
Checkpoint shared push authorities atomically
brow Sep 3, 2026
22b73b2
Preserve shared push recovery authority
brow Sep 3, 2026
3373281
Update embedded migration inventory
brow Sep 3, 2026
ad0e67f
Continue independent push migration groups
brow Sep 3, 2026
2fcf564
Recover quarantined push installations
brow Sep 3, 2026
49d8ac3
Recover response-lost legacy enrollment
brow Sep 3, 2026
843170d
Migrate gateway tombstone indexes
brow Sep 3, 2026
838d0dc
Fence push migration acceptance
brow Sep 3, 2026
4b59a1d
Fence push cleanup against token rotation
brow Sep 3, 2026
deab86b
Preserve push migration work after rotation
brow Sep 3, 2026
18d4a07
Journal push migration authority groups
brow Sep 3, 2026
ea811c2
Fence stale push lease publication
brow Sep 3, 2026
14d38ce
Fence stale push enrollment
brow Sep 3, 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
5 changes: 2 additions & 3 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -75,10 +75,9 @@ RELAY_URL=ws://localhost:3000
# BUZZ_WEB_DIR=./web/dist

# NIP-PL mobile push is an explicit deployment opt-in. A gateway URL alone
# never enables it. When enabled and the URL is absent, the canonical
# https://push.buzz.xyz/v1/deliveries/apns endpoint is used.
# never enables it. When enabled, the exact HTTPS delivery URL is required.
BUZZ_PUSH_ENABLED=false
# BUZZ_PUSH_GATEWAY_DELIVERY_URL=https://push.buzz.xyz/v1/deliveries/apns
BUZZ_PUSH_GATEWAY_DELIVERY_URL=https://push.buzz.xyz/v1/deliveries/apns

# -----------------------------------------------------------------------------
# Admin Dashboard (private moderation surface)
Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/_ci-clients.yml
Original file line number Diff line number Diff line change
Expand Up @@ -111,9 +111,9 @@ jobs:
- name: Analyze
run: cd mobile && flutter analyze
- name: Test
run: cd mobile && flutter test
run: cd mobile && flutter test --dart-define=BUZZ_PUSH_GATEWAY_URL=https://push.example
- name: Build Android debug APK
run: just mobile-build-android
run: BUZZ_PUSH_GATEWAY_URL=https://push.example just mobile-build-android

mobile-swift:
name: Mobile Swift
Expand All @@ -132,7 +132,7 @@ jobs:
- name: Test
run: swift test --package-path mobile/ios/BuzzPushKit
- name: Build complete unsigned iOS release
run: cd mobile && flutter build ios --release --no-codesign --no-pub
run: cd mobile && flutter build ios --release --no-codesign --no-pub --dart-define=BUZZ_PUSH_GATEWAY_URL=https://push.example

results:
name: Results
Expand Down
2 changes: 1 addition & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -691,7 +691,7 @@ The mobile app lives in `mobile/` — a Flutter app using Riverpod + Hooks.
cd mobile
dart format --output=none --set-exit-if-changed .
flutter analyze
flutter test
flutter test --dart-define=BUZZ_PUSH_GATEWAY_URL=https://push.example
```

Or from repo root: `just mobile-fmt` (auto-fix), `just mobile-check` (lint + fmt check), `just mobile-test` (tests).
Expand Down
13 changes: 10 additions & 3 deletions Justfile
Original file line number Diff line number Diff line change
Expand Up @@ -804,7 +804,7 @@ mobile-check:

# Run mobile tests
mobile-test:
unset GIT_DIR GIT_WORK_TREE; cd {{mobile_dir}} && flutter test
unset GIT_DIR GIT_WORK_TREE; cd {{mobile_dir}} && flutter test --dart-define=BUZZ_PUSH_GATEWAY_URL=https://push.example

# Regenerate the emoji dataset asset from desktop's emoji-mart install.
# Output is committed — rerun after bumping @emoji-mart/data.
Expand All @@ -813,8 +813,9 @@ mobile-emoji-data:

# Compile an unsigned Android debug APK (worktree-aware debug identity)
mobile-build-android:
test -n "${BUZZ_PUSH_GATEWAY_URL:-}" || { echo "BUZZ_PUSH_GATEWAY_URL is required" >&2; exit 1; }
Comment thread
brow marked this conversation as resolved.
./scripts/mobile-worktree-overrides.sh
unset GIT_DIR GIT_WORK_TREE; cd {{mobile_dir}} && flutter build apk --debug --no-pub
unset GIT_DIR GIT_WORK_TREE; cd {{mobile_dir}} && flutter build apk --debug --no-pub --dart-define="BUZZ_PUSH_GATEWAY_URL=${BUZZ_PUSH_GATEWAY_URL}"

# Run the mobile app on iOS simulator (worktree-aware debug identity)
mobile-dev:
Expand All @@ -825,9 +826,15 @@ mobile-dev:
sleep 3
fi
./scripts/mobile-worktree-overrides.sh
gateway_url="${BUZZ_PUSH_GATEWAY_URL:-}"
overrides_file="{{mobile_dir}}/ios/Flutter/AppOverrides.xcconfig"
if [[ -z "$gateway_url" && -f "$overrides_file" ]]; then
gateway_url="$(sed -nE 's/^[[:space:]]*BUZZ_PUSH_GATEWAY_URL[[:space:]]*=[[:space:]]*(.*[^[:space:]])[[:space:]]*$/\1/p' "$overrides_file" | tail -n 1 | sed 's/\$()//g')"
fi
test -n "$gateway_url" || { echo "BUZZ_PUSH_GATEWAY_URL is required in the environment or AppOverrides.xcconfig" >&2; exit 1; }
cd {{mobile_dir}}
unset GIT_DIR GIT_WORK_TREE
flutter run
flutter run --dart-define="BUZZ_PUSH_GATEWAY_URL=${gateway_url}"

# Uninstall stale worktree-suffixed Buzz debug installs (production apps kept)
mobile-clean:
Expand Down
2 changes: 1 addition & 1 deletion crates/buzz-db/src/runtime/migration.rs
Original file line number Diff line number Diff line change
Expand Up @@ -702,7 +702,7 @@ mod postgres_tests {
let mut migrations: Vec<_> = MIGRATOR.iter().collect();
migrations.sort_by_key(|migration| migration.version);

assert_eq!(migrations.len(), 44);
assert_eq!(migrations.len(), 45);
assert_eq!(migrations[0].version, 1);
assert_eq!(&*migrations[0].description, "initial schema");
assert!(migrations[0]
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
-- Revoked installations remain as retry tombstones until authority expiry.
-- Restrict ownership uniqueness to live rows so a replacement can enroll
-- without deleting the old installation's idempotency state.
ALTER TABLE push_gateway_installations
DROP CONSTRAINT push_gateway_installations_app_attest_key_id_key;
ALTER TABLE push_gateway_installations
DROP CONSTRAINT push_gateway_installations_app_profile_token_fingerprint_key;

CREATE UNIQUE INDEX push_gateway_installations_active_app_attest_key
ON push_gateway_installations (app_attest_key_id)
WHERE revoked_at IS NULL;

CREATE UNIQUE INDEX push_gateway_installations_active_profile_token
ON push_gateway_installations (app_profile, token_fingerprint)
WHERE revoked_at IS NULL;
Loading
Loading