Rounds out the phoenix rebrand for assets the earlier logo.svg swap
missed:
- public/icon-192.png / icon-512.png (PWA install icons, referenced by
manifest.webmanifest) still had the old bolt-on-circle mark.
- Android's push-notification status-bar icon (ic_stat_ditto, all
densities) was carrying an even older mark — a ringed-planet icon
from 'Ditto', the project two forks back. Regenerated as a white
phoenix silhouette (status-bar icons must be flat white on
transparent; the OS tints them).
- android/.../splash_icon_vector.xml, the actual live Android 12+
splash icon (wired via styles.xml's windowSplashScreenAnimatedIcon),
had the old double-bolt path hardcoded. Replaced with the phoenix
path and recomputed the scale/center math for its 1446x1246 viewBox.
- ios/.../Splash.imageset (wired into LaunchScreen.storyboard) had an
even older blue crossed-arrow mark predating Agora. Regenerated as
the brand-orange phoenix on white, matching the existing small
centered-mark proportions.
Also deleted the legacy per-density drawable*/splash.png and
drawable/splash_icon.png rasters: confirmed unreferenced by any theme,
manifest, or code (the app fully migrated to the Android 12
SplashScreen API / splash_icon_vector.xml), so they were dead weight
carrying outdated branding no user could ever see.
generate-icons.sh now produces all of the above so future logo changes
regenerate everything in one pass instead of missing assets again.
Note: unlike the web assets, the Android/iOS changes here only take
effect on the next native app build + store release — there's no web
deploy step for them.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
og-image.jpg (the link-preview image for eranos.fund) still carried the
Agora bolt logo and wordmark, plus an in-app mockup labeled 'Agora'.
Recreated it in-place via a headless-Chromium render: same world-map/
phone-mockup background, Agora branding swapped for the Eranos phoenix
in both spots.
Also removed the 'Who made Eranos?' FAQ entry, which credited Soapbox/
Ditto (the upstream Agora fork) rather than describing Eranos itself.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The nonlogs.io link previously sat on 'Skip the public receipt', a
behavioral tip with no relation to exchanges — clicking through led
somewhere the surrounding copy didn't explain. Looked up NonLogs (a
privacy-first exchange, no KYC/logs/account required, listed by the
Grin community for GRIN/USDT trading) and gave it its own card next to
'Acquire Grin without KYC', where it actually belongs. 'Skip the
public receipt' is now a plain tip with no dangling external link.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- 'Acquire Grin without KYC' copy now names Bisq as one option, not the
only one.
- 'Skip the public receipt' now links to nonlogs.io (no-KYC exchange)
instead of a coinjoin wallet, which didn't match the card's point.
- 'Exchanges know who you are' overstated that all exchanges track
withdrawals; softened to 'some' and points to nonlogs.io as the
no-KYC alternative.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Point the Exchanges tile at nonlogs.io (no-KYC) and match its chip/copy
to the Peer-to-peer tile's 'no KYC' framing. Drop the Spend it directly
tile — no vetted resource to link yet.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
LandingHero (shown as the splash above the feed) hardcoded the
fork-original 'ÁGORA' brand name instead of config.appName like
TopNav does.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
step-2-send.jpg showed a Bitcoin-B coin; Eranos is Grin-only. Replaced
with the MW smiley-coin, matching the alt text already in en.json.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The header, sidebar, hero, onboarding, and auth screens draw the brand
mark from inline React SVG components, not /logo.svg — so the previous
logo swap didn't reach them. LogoIcon now carries the phoenix path
(currentColor); AgoraBoltIcon wraps it in fixed brand yellow.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Replace the diamond-bolt mark with the phoenix (brand yellow #fcd414).
Regenerate favicons, web logo.png, and Android/iOS launcher icons from
the new public/logo.svg; update the generator scripts for the new
viewBox (1446x1246) and fill color.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Rebrand Agora to Eranos and strip the non-Grin rails. Add Grin donations:
a GoblinPay client + GrinPayDialog, on-chain payment-proof verification
(receiver-sig + kernel-on-chain + dedupe), and a proof-verified campaign
tally (kind 3414). Shift the brand from orange to gold. 118 tests green.
The popup's donate button and learn-more link used a React Router
<Link> inside the Radix dialog. The dialog's click handling swallowed
the SPA navigation, so the click only closed the popup and left the user
on the home page — looking like the popup cleared itself out and went
nowhere.
Point both at the absolute production URL (https://agora.spot/venezuela-relief)
via a plain <a href>, which does a full, reliable navigation regardless
of the dialog's event handling.
Replace the single baked-in terremoto-venezuela campaign with a live,
agnostic showcase: every Venezuela-located campaign tagged
`humanitarian-aid` or `emergency-relief` and created since the
earthquake is pulled in and rendered as a card carousel across the home
hero and the dedicated relief page.
- New useVenezuelaReliefCampaigns hook queries kind 33863 filtered by
`#i: [iso3166:VE]` + `#t: [humanitarian-aid, emergency-relief]` +
`since` (quake timestamp), and aggregates on-chain raised totals the
same way useProfileCampaignStats does (one /address lookup per
campaign, summed; no per-receipt /tx fan-out). The flagship
terremoto-venezuela campaign predates the geo-tag convention and
carries no `iso3166:VE` tag, so it's pinned by coordinate and merged
ahead of the filtered results, deduped by aTag.
- Extend useCampaigns with `categories` (`#t`) and `since` options.
- New VenezuelaReliefShowcase: an auto-panning marquee of CampaignCards
(seamless -50% loop, hover/focus pause, click-drag + momentum, edge
fades, prefers-reduced-motion fallback to a native scroll rail),
ported from the surveil deck shelf.
- Hero/page CTAs and the popup donate button now point at the relief
page (no more single-campaign naddr deep-link); the page CTA scrolls
to the showcase. Drop the embedded CampaignDetailPage, the
.relief-donate-flash CSS, and the now-unused scroll-to-campaign logic.
- VenezuelaReliefGoal now reads the aggregate hook and shows the
combined raised total + matching-campaign count only (no goal bar —
an aggregate goal across independent campaigns is meaningless).
- Tighten the hero height so the carousel sits near the fold.
- Locale updates across all 16 languages: drop `startCampaign`/`goalOf`,
add `showcaseTitle` + `campaignCount`.
Resolve the terremoto-venezuela campaign (naddr) directly in the relief
banner, popup, and dedicated page, turning each into an info + donation
hybrid:
- New useVenezuelaReliefCampaign hook + VenezuelaReliefGoal component
surface the campaign's live raised/goal progress in all three surfaces.
- Donate CTAs deep-link to the campaign naddr; on the dedicated page the
full campaign detail (story, donate panel, ledger, comments) is embedded
below the appeal hero, and "Donate to relief" smooth-scrolls to the
donate panel and flashes a highlight ring (mobile inline + desktop
sidebar). Scroll margin clears the sticky nav.
- Drop the "Raise funds for Venezuela" button; shrink the page hero.
- Add the goalOf locale key across all 16 locales.
Extend the home-page Venezuela earthquake relief appeal beyond the hero
banner so it can reach more visitors and be shared directly:
- Session popup (VenezuelaReliefPopup) mounted site-wide in AppRouter.
Shows once per browser session (sessionStorage) on a fresh load of any
route, carrying the same photo, headline, and donate CTA as the hero.
- Dedicated /venezuela-relief page (VenezuelaReliefPage) so the appeal
has its own shareable URL with SEO/OG metadata and a "how your donation
helps" non-custodial explainer. The hero and popup link to it via
"Learn more".
- Share buttons (native share sheet, clipboard fallback via shareOrCopy +
useShareOrigin) on the hero banner, popup, and page.
- Shared constants in lib/venezuelaRelief.ts (route, image gallery,
donate deep-link, popup sessionStorage key) keep all three surfaces in
sync.
- Fix the highlighted "you" word to match the home hero idiom
(leading-[0.95] so the orange block hugs the cap height).
The popup decides whether to open exactly once per page load via a
module-level guard, so React 19 StrictMode's double-mount can't write the
"seen" flag on the first mount and then suppress the popup on the remount
(which made it flash open and immediately dismiss).
New venezuelaRelief locale keys added to en.json and translated across
all fifteen other locales.
The donors_one/donors_other plural keys were the last consumer of the
donor count, which the previous commit dropped from the campaign card.
Delete them from en.json and all fifteen other locales.
The card footer showed "x donors", sourced from useCampaignDonations'
donorCount. Populating that count required fetching every kind 8333
receipt for the campaign and then verifying each one with a per-receipt
Esplora /tx call — a fan-out that, across a ~200-card grid, hammered
every configured Esplora backend.
Cards only ever render the raised total (the progress bar), which needs
just the single /address balance lookup. Add a receipts option to
useCampaignDonations that skips the receipt fetch and verification
fan-out, and have CampaignCard pass receipts: false. Remove the now-dead
donor-count UI and its unused t()/useTranslation import.
Pin a full-bleed emergency relief banner to the top of the home page
during the Venezuela earthquake response. It rotates through news
photographs from Caracas via the shared HeroBanner (slow crossfade +
Ken-Burns pan), with a humanitarian headline and two CTAs: Donate to
relief (deep-links to /campaigns?country=VE) and Raise funds for
Venezuela (auth-gated campaign creation).
Also fix a latent HeroBanner crossfade bug where new layers mounted at
their final opacity, making transitions snap instead of fade; layers now
mount hidden and flip visible on the next animation frame.
Copy lives under campaigns.home.venezuelaRelief.* and is translated
across all 16 locales.
Keep the fast pooled first render, but merge each read relay's DM backfill
into the visible inbox as soon as that relay finishes instead of waiting for
all relays. Track per-relay sent/received cursors so older pagination cannot
skip dense relay history because another relay returned older sparse events.
Timed-out or failed relays are kept retryable instead of being marked
exhausted, while successful relay cursors unlock deterministic pagination.
Backfilled events still dedupe by id and update latest previews/sort order.
Use the shared pooled query for the initial messages page so the inbox keeps
Ditto-style fast first paint with the provider's short eoseTimeout. Page 0 is
marked pending backfill, then a background effect queries each configured read
relay individually, merges those slower results into the same infinite-query
cache entry, and unlocks older-page pagination after backfill completes.
Also update conversation merging so a backfilled newer event updates the row's
latest preview and sort order.
The inbox query went through the shared pool, whose eoseTimeout resolves as
soon as the first relay sends EOSE (+300ms). DMs held only by slower relays
were dropped, so each hard refresh returned a different, incomplete set of
conversations. Fan the kind-4 query out to each configured read relay
individually (Promise.allSettled, bounded by the existing 8s cap) and merge
deduped by event id, so every relay contributes its full set.
The inbox query key now carries the read-relay list; update the send-message
optimistic cache writes to match ['direct-messages', pubkey] by prefix so the
append still lands.
handleMute awaited addMute's relay round-trip (fetch fresh kind 10000 +
publish) before hiding the conversation, leaving the muted thread visible
for a few seconds. Hide the peer optimistically the moment the user
confirms; the relay-backed mute list still reconciles on reload.
Adds a 'New message' button to the conversation list (and the empty-pane
prompt) that opens a fresh compose pane in the right column instead of a
modal. The pane has a 'To:' field that drives debounced profile search via
useSearchProfiles (name / NIP-05 / npub / nprofile), rendering suggestions
inline beneath the field — no popover. Arrow-key navigation + Enter select a
recipient; choosing one opens the normal thread (existing conversation or a
fresh blank thread). Adds the supporting locale strings across all locales.
bottom-full anchored the bubble above the avatar block's top edge, which
margin-collapses up into the banner, pushing the bubble off the visible
area. Position it with a top offset within the same coordinate space the
original used, lowered so its tail rests at the banner's bottom edge.
- Anchor the NIP-38 status bubble to the bottom edge of the banner so it
no longer overlaps the follow/donate action buttons.
- Drop the founder/verified footer badges from the profile Agora tab so its
campaign cards render identically to the campaigns page CampaignCard.
- Recolor the 'raised' stat from text-orange-500 to text-primary to match
bio/profile hyperlink coloring.
The back arrow used top-5 on a size-9 padded button, sitting lower than
the X close button (top-4, size-5 icon). Move it to left-2 top-2 so its
icon center lines up with the X on the opposite side.
Overhaul AuthDialog's login step:
- Add translation keys for every previously-hardcoded string (titles,
buttons, placeholders, status labels, validation/errors) across all
sixteen locales.
- The secret-key form is no longer collapsible — it's always open and is
the first option, followed by 'Log in with extension', then a
text-with-arrow link to the remote-signer step.
- Move the key-file upload icon onto the same row as the nsec input
(instead of beside the submit button); submit button is now full-width
below.
- Surface extension-login errors as a destructive toast rather than
writing them into the nsec input's inline error.
- Replace the centered 'Back' text buttons with a back arrow in the
top-left of the dialog header.
Also correct AGENTS.md's i18n section: the project ships fifteen
non-English locales (hi, id, sw, tr, zh-Hant were missing from the list).
Logged-in users change language via Settings, so the top-nav globe now
appears only when logged out (matching the search icon). On the homepage
hero, replace the 'Explore campaigns' button with 'Verify campaigns' and
order it before 'How it works'. Drop the now-unused exploreCampaigns
locale key across all locales.