Record successful relay OK acknowledgements in RelayPool.seen
so posts and manual broadcasts update relay provenance.
Failed OK responses remain ignored.
Changelog-Fixed: Update note relay counts after successful
post or broadcast relay acknowledgements.
Signed-off-by: Sjors Provoost <sjors@sprovoost.nl>
Restore RelayPoolTests to damusTests after 9091cb1a removed it
from the Xcode test target unintentionally.
Update its add-relay checks for the current async RelayPool API.
Signed-off-by: Sjors Provoost <sjors@sprovoost.nl>
Move the shared seen, count, and notification update into a
note-id helper.
This commit does not change behavior.
Signed-off-by: Sjors Provoost <sjors@sprovoost.nl>
Closes: #3675
Changelog-Fixed: Fixed an issue where posts would not appear on the user's own timeline if they did not follow themselves
Signed-off-by: Daniel D’Aquino <daniel@daquino.me>
Restore signal indicator
Changelog-Changed: Restored signal indicator
Changelog-Fixed: Fixed issues that could cause the signal indicator to become outdated
When isConnecting gets stuck (e.g. from silenced error 57 or lost
WebSocket events), reconnect() would bail out permanently. Instead of
unconditionally blocking on isConnecting, allow reconnect if the
connection attempt has gone stale (>5s with no socket response).
Closes: https://github.com/damus-io/damus/issues/3774
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The SignalView was never appearing because update_signal_from_pool was
defined but never called, leaving signal data at 0/0. Fix by having
RelayPool maintain its own SignalModel, updating it on connection
events, relay add/remove. Wire views directly to the pool signal via
NostrNetworkManager instead of the disconnected HomeModel.signal.
Replace the text-based indicator with signal strength bars matching
the Android app: 4 progressive-height bars colored red->yellow->green
based on the connected/total relay ratio.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Warn and skip upload when SENTRY_AUTH_TOKEN is not set. Invoke
sentry-cli
with --auth-token, --org and --project flags and attempt an upload
including sources, falling back to a plain dSYM upload on failure.
Changelog-None
Closes: #3767
Signed-off-by: Daniel D’Aquino <daniel@daquino.me>
Changelog-Added: Added Sentry error and diagnostics reporting to aid
future quality improvements
Closes: #3731
Signed-off-by: Daniel D’Aquino <daniel@daquino.me>
Changelog-Changed: Clear stale LMDB readers on NostrDB init to prevent
reader slot leakage and runaway storage usage
Signed-off-by: Daniel D’Aquino <daniel@daquino.me>
This addresses one failure path where if the value getter for a new
transaction returns `nil`, it would leak a read transaction, causing it
to remain open indefinitely, and leading to runaway storage usage.
Changelog-Fixed: Fixed database transaction leak that could lead to
higher storage usage
Signed-off-by: Daniel D’Aquino <daniel@daquino.me>
Remove Tenor API client and models; add PurpleGIFAPIClient and a
robust GIFModels decoder that supports Tenor and KLIPY payloads.
Remove Tenor API key setting and Secrets entry. Update GIF picker to
accept a Purple-backed view model, adjust Labs text, and update
Xcode project file references.
Closes: #3695
Changelog-Changed: Made GIF keyboard widely available to Purple users
without need for an API key (Damus Labs)
Signed-off-by: Daniel D’Aquino <daniel@daquino.me>
mode
- Skip automatic compaction when `data.mdb` is 10GB or larger, and
surface an in-app notification instead of surprising users with a long
startup wait
- Keep manual compaction available for large databases by tracking
whether a next-launch compaction request was scheduled automatically
or explicitly by the user
- Add a large-database explanation to the compaction loading screen to
clarify that long runtimes are expected for oversized databases and
are usually a one-time catch-up cost
- Add a developer-only `Every minute` auto-compact schedule to make
rollout and reminder behavior easier to test locally
- Add and update unit tests covering large-database auto-compaction
skips, request-source persistence, reminder scheduling, and the
developer testing interval
Motivation:
TestFlight users with long-lived databases were hitting the brand-new
compaction flow for the first time, which could turn startup into a
multi-minute wait. These changes make automatic compaction less
disruptive for very large databases, preserve an explicit manual path
for users who want to optimize immediately, and add a fast
developer-only schedule to make the new behavior easier to validate
during testing.
This is an enhancement for an unreleased feature, so therefore no
changelog is needed.
Closes: https://github.com/damus-io/damus/issues/3730
Changelog-None
Signed-off-by: Daniel D’Aquino <daniel@daquino.me>
Add NdbCompactionProgress and Step with user-facing titles/details,
and a progress callback to Ndb.compact_if_needed to emit stage updates.
Refactor CompactionView to a single CompactionState and render linear
progress, step title/detail and percentage. Ensure UI updates happen on
the MainActor and surface errors/completion cleanly.
Changelog-None
Closes: https://github.com/damus-io/damus/issues/3730
Signed-off-by: Daniel D’Aquino <daniel@daquino.me>
Introduce CompactionView and CompactionLoadingView to schedule and run
Ndb compaction on a background task before showing the main UI. Replace
the direct compaction calls in ContentView and make CompactionView the
app's launch entry so startup compaction presents a loading UI and
avoids blocking the main thread.
Changelog-Fixed: Fixed startup crash when app performs long-running
compaction procedure
Closes: #3726
Signed-off-by: Daniel D’Aquino <daniel@daquino.me>
The blur overlay previously used error-state iconography (eye.slash icon,
"Tap to load" button, raw URL display) which made users think media was
broken rather than intentionally hidden. Redesign to communicate
intentional protection:
- Replace eye.slash icon with shield icon
- Change title from "Media from someone you don't follow" to
"Content hidden" (the old text was also wrong for undistractMode)
- Rename button from "Tap to load" to "Show"
- Remove raw URL display that added noise
- Remove unused properties (artifacts, size, damus_state, parentView)
and dead ParentViewType enum that only existed for the URL display
- Simplify all 4 call sites to pass only the blur binding
Changelog-Changed: Redesigned media blur overlay to look like intentional protection instead of a broken state
Closes: https://github.com/damus-io/damus/issues/3662
Signed-off-by: alltheseas <alltheseas@users.noreply.github.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This reverts commit c1fb8b592f.
It turns out we still need transaction inheritance.
Even though the current Ndb interface hides transaction objects from callers and prevents those transactions from being held open beyond the small sync window where the underlying query result is borrowed, there is nothing preventing that caller from making another nested ndb query call from within that closure.
Closes: https://github.com/damus-io/damus/issues/3688
Changelog-Fixed: Fixed issue where mentioned profile names would not render properly
Signed-off-by: Daniel D’Aquino <daniel@daquino.me>
The previous fix that implemented cleanup of temporary snapshots
included a max age for stale temporary snapshots, which was originally
set to 24h.
This improved the situation, but it still meant that the app could
accumulate 24 old snapshots, which leads to a non-trivial storage
amount.
This commit changes that to 30 minutes for better storage efficiency.
The previous fix was not published on the App Store yet, so no changelog
entry is needed.
Closes: https://github.com/damus-io/damus/issues/3696
Changelog-None
Signed-off-by: Daniel D’Aquino <daniel@daquino.me>
Also clean up temp directory on post-replace size mismatch to match
all other error paths in compact_if_needed.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>