Recent Releases of FireAlert

FireAlert - 2026-07-23

I'll gather the necessary information from each PR to create a comprehensive release note. Let me fetch the details for all PRs.Now let me get the commits for each PR to gather more detailed information:# Overview

This release includes authentication hardening improvements, Protected Sites map visibility enhancements, and critical database maintenance fixes. The changes improve session security, extend fire alert visibility to Protected Sites, and resolve a long-standing issue where database cleanup crons were unable to advance their cutoff dates on persistent deployments.

What's Changed

Features & Fixes

  • fix: gate disabled alert-method buttons and repair Auth0 refresh-token flow: Enhanced authentication flow with automatic access token refresh and request retry on session expiration. Settings SMS/Email/Webhook buttons now properly respect the backend's enabled flag. Implemented session-expiration notifications and automatic logout handling with a toast message. Fixed a broken getCredentials() call that was passing the refresh token into the SDK's scope parameter instead of letting it manage the refresh token internally. Added real 401 recovery for both the tRPC client and axios wrapper with a de-duped refreshAccessToken() utility to prevent duplicate refreshes on concurrent 401s.

  • feat(map): show fires and incidents for Protected Sites: Extended map view to display fire alerts and incident boundaries for Protected Sites alongside user-owned sites. Added new alert.getAlertsForProtectedSites tRPC query that mirrors the existing alert.getAlerts endpoint, resolving sites through SiteRelation instead of userId. Protected Site alerts now support all existing features including date filters, alert details sheets, and the alerts/incidents view toggle with no additional UI changes required.

  • fix: db-cleanup cron never advances its cutoff date on long-running deployments: Fixed critical issue where the daily database cleanup cron had frozen cutoff dates on persistent Coolify deployments. The cleanup cutoff date was computed once at module load and never recomputed, causing accumulated backlog to go unprocessed. Restructured currentDateTimeAt1AM from a module-level const to be reassigned at the top of each request handler, ensuring fresh cutoff calculations on every invocation. Extended notification cleanup to also capture and delete failed/skipped notifications (where isSkipped: true and sentAt was never set) once 90 days old by createdAt timestamp.

PR Maps

Biosphere - Wildfire - TypeScript
Published by rupamkairi about 1 month ago

FireAlert - 2026-06-26

Summary

This release includes two critical hotfixes that improve app reliability and user authentication experience. Both fixes address race conditions and error handling issues discovered during testing.

Highlights

  • Cold-start notification deep-linking now reliable — OneSignal listener registered immediately on app mount, eliminating race condition where notification taps failed silently on killed-app restarts.
  • Email verification flow improved — Unverified Auth0 accounts now trigger the correct verification modal instead of generic login failures.

Changes by PR

Problem: On cold start via notification tap, deep-linking silently failed. The OneSignal click listener was gated behind auth state initialization (~1-3s), but the SDK fired the click event at app startup (t=0). Result: notification taps landed on home screen with no map focus.

Solution:

  • OneSignalContext.tsx — Initialize OneSignal and attach click listener immediately on mount, independent of auth state. Gated init still runs for subscription/sync setup. initialize() is idempotent.
  • Home.tsx — Isolate camera zoom tRPC fetch in its own try/catch so failed zoom doesn't block incident dispatch.
  • Removed debug logging.

Impact: Incident and alert notifications now open reliably on cold start, app maps focus immediately, and bottom sheets load without delay.

PR: https://github.com/Plant-for-the-Planet-org/FireAlert/pull/353


PR #354 — fix(login): show email verification modal for Auth0 access_denied / email_not_verified

Problem: Auth0 returns access_denied with email_not_verified for unverified accounts, not unauthorized. The old check only matched unauthorized, so all three failure paths showed generic Login Failed toast, and the verification modal never appeared.

Solution:

  • New apps/nativeapp/app/utils/authErrors.tsisUnverifiedEmailError() helper matches unauthorized, access_denied + email_not_verified, and message fallback.
  • Login.tsx — Added showEmailVerificationModal() helper; wired all three error paths (hook error, catch block, null creds) to use it.
  • Removed transparent from Modal background to prevent iOS safe-area bleed-through.

Impact: Unverified and signup-return users now see the verification modal correctly. No more silent loading spinner or incorrect toast messages.

PR: https://github.com/Plant-for-the-Planet-org/FireAlert/pull/354


Ops & QA Notes

  • No schema migrations in these PRs.
  • Deploy native app + server together for best UX.
  • QA steps:
    • Cold-start incident notification tap → app opens → map focuses → bottom sheet loads ✓
    • Cold-start alert notification tap → app opens → map focuses → alert sheet loads ✓
    • Warm-start (app in background) notification tap still works ✓
    • Unverified sign-in → verification modal shown (not toast) ✓
    • Verified sign-in → normal login completes ✓
    • Cancel Auth0 browser → generic failure (toast), not verification modal ✓

Would you like me to refine the format, add more details, or create a GitHub release directly?

Full Changelog: https://github.com/Plant-for-the-Planet-org/FireAlert/compare/2026-04-16...2026-06-26

Biosphere - Wildfire - TypeScript
Published by rupamkairi about 1 month ago

FireAlert - 2025-05-05

Summary

This release delivers end-to-end push notification deep-linking for the native app (Android + iOS), fixes two critical server-side bugs that were silently dropping all device notifications, and ships a structured logfmt observability improvement for BetterStack. A batch of security and maintenance dependency upgrades is also included.


Changes

Critical Bug Fixes — #331

  • AlertMethodMethod type-only import — enum was erased at compile time, causing a silent ReferenceError that skipped all device notifications. Fixed to a value import.
  • Unfiltered notification iterationPromise.all was iterating the original notifications array instead of filteredNotifications, sending pushes to disabled alert methods. Fixed.
  • Logger debug level leaking to Logtail — debug entries were routed as INFO in production. Now gated to NODE_ENV === 'development'.

Deep-Linking for Push Notifications — #331

  • firealert:// custom scheme — notifications now use firealert://alert/:alertId, bypassing iOS Safari intercept.
  • Cold-start queuing — notification tap events are queued if NavigationContainer isn't ready yet, then flushed on onReady.
  • Map zoom on tap — Home screen locates the tapped alert and calls camera.setCamera via calculateAlertCamera; skips default user-location zoom when alertId/incidentId is in params.
  • Re-tap support__ts nonce in deep-link params forces useEffect to re-fire on repeated taps.
  • OneSignal URL suppressionOneSignal_suppress_launch_urls = true added to iOS Info.plist, mirroring Android's existing config.
  • Platform config — Android intent-filters (/incident, /verify, firealert://), MainActivity.onNewIntent; iOS AppDelegate URL bridging, app group entitlement, AASA headers via Next.js config; server serves /.well-known/apple-app-site-association and assetlinks.json.

Android: OneSignal Permission Fix — #338 / #339

  • Fixed permission state not being correctly propagated to OneSignal, causing push registration failures on some Android devices.
  • Version bump and CodeRabbit feedback addressed.

Observability: Reduced BetterStack Log Volume — #340

  • Collapsed per-provider/per-incident/per-notification info lines into single logfmt summaries (stage=... event=...); verbose logs are dev-only.
  • Added escapeLogfmt() helper to prevent stack traces from fragmenting log records.
  • Removed clientApiKey and raw destination (PII) from log tags.
  • Fixed unsafe (error as Error) casts with error instanceof Error guards.
  • Fixed GEO provider tags in site alert logs; notification sender no longer halts after skipped batches.

Tooling — #329

  • Added .claude/ config for Claude Code worktree management; cleaned up older feature instruction files.

Dependency Updates

#328 + Dependabot

apps/server

Package From To
next ^16.1.5 ^16.2.3
nodemailer ^6.9.1 ^8.0.5
postcss ^8.5.6 ^8.5.10
@types/nodemailer ^6.4.7 ^8.0.0

apps/nativeapp (v1.9)

Package From To
axios ^1.13.5 ^1.15.0
Android versionCode 24 26
iOS build number 28 31
activesupport (Ruby) 7.2.2.1 7.2.3.1
addressable (Ruby) 2.8.7 2.9.0

Indirect / Security

  • ajv 6.12.66.14.0
  • rollup 4.54.04.59.0
  • minimatch 3.1.23.1.5
  • flatted 3.3.33.4.2
  • node-forge 1.3.21.4.0
  • follow-redirects 1.15.111.16.0
  • brace-expansion 1.1.121.1.14
  • fast-xml-parser 4.5.34.5.6
  • lodash 4.17.234.18.1
  • yaml 2.8.12.8.3
  • picomatch 2.3.12.3.2
  • protocol-buffers-schema 3.6.03.6.1

Tooling

  • .yarnrc: enabled --install.frozen-lockfile true for reproducible installs.
  • package-lock.json removed — yarn.lock is the single source of truth.

📜 Full Changelog

PR Type Title
#328 chore Update multiple dependencies to latest versions
#329 chore Configure Claude Code worktree management
#331 fix Resolve notification delivery failures and complete deep-link flow
#338 fix Fix Android OneSignal permission propagation
#339 chore Version bump & CodeRabbit feedback
#340 perf Reduce BetterStack log volume with logfmt summaries
#337 release Release: Update dependencies and Claude Config & DeepLinking

Full diff: develop...main

Biosphere - Wildfire - TypeScript
Published by rupamkairi 4 months ago

FireAlert - 2026-04-16

Summary

  • This release includes three merged PRs that clean up logs, harden notification transactions, and improve the incident page UX with hover/focus interactivity and timezone-aware times.

Highlights

  • Less noisy and more structured logs.
  • Safer transaction handling when creating incident notifications.
  • Incident page: hover/focus highlights related incidents on the map.
  • Incident times show timezone-aware formatting where site coords exist.

Changes by PR

  • PR #321 — Feature: optimising logs

  • PR #322 — refactor: restructure transaction logic in CreateIncidentNotifications

  • PR #324 — Enhance incident page with hover/focus interactivity and timezone support

    • Adds hover and keyboard-focus interactivity for related incidents on the incident page.
    • Highlights related incident polygons and shows related incident fire points non-interactively.
    • Formats incident times with timezone offsets when site coordinates are available.
    • Adds small UI wiring and feature-flag checks for staged rollout.
    • PR: https://github.com/Plant-for-the-Planet-org/FireAlert/pull/324

Ops & QA notes

  • No schema migrations in these PRs. Deploy server and frontend together for best UX.
  • Watch notification cron logs after deploy to confirm cleaner logs and no new transaction errors.
  • QA steps:
    • Verify cron runs produce concise logs and the key stats are visible.
    • Trigger notification flows; confirm no partial writes and that notifications are created as expected.
    • Open an incident page with related incidents. Hover rows and tabs; confirm map highlight and non-interactive related markers.
    • Check incident time formatting for a site with known coordinates.

Links

What's Changed

Full Changelog: https://github.com/Plant-for-the-Planet-org/FireAlert/compare/2026-03-23...2026-04-16

Biosphere - Wildfire - TypeScript
Published by rupamkairi 4 months ago

FireAlert - 2026-04-07

Overview

Updated Incident Boundary for Mobile. Incident Boundary will shape according to the detected fires with improved calculation on boundary area.
Added Stop Incident Notifications - so you can flag incidents, leading to less flooding of notifications.

Bug Fixes

Incorrect height improved for details view for the Sites Info in the Bottom Sheet.
Minor Fixes & Improvements.

What's Changed

Full Changelog: https://github.com/Plant-for-the-Planet-org/FireAlert/compare/2026-03-23...2026-03-26

Biosphere - Wildfire - TypeScript
Published by rupamkairi 5 months ago

FireAlert - 2026-03-23

Overview

Introduces proximity-based fire incident detection and association, a JSONB metadata column on SiteIncident to track centre time-series, and STOP_ALERTS notification suppression across incident and site-alert flows.

What's Changed

Features & Fixes

  • Add SiteIncident.metadata, migration & doc ([#293]): Adds a JSONB metadata column to SiteIncident via migration to support structured per-incident data. Documents the planned proximity-based association model using metadata.centres ({latitude, longitude, at}) and the strategy for selecting the closest active incident within INCIDENT_PROXIMITY_KM. Existing stale-incident resolution and association logic in SiteIncidentService.ts is commented out as preparatory work, kept for reference.

  • Enforce STOP_ALERTS notification suppression ([#295]): Skips incident and site-alert notifications when reviewStatus is STOP_ALERTS, logging suppressed counts per method. Adds unsubscribe token support to incident email notifications. Aligns reviewStatus typing and validation against Prisma.SiteIncidentReviewStatus across server and native layers. Adds documentation covering stop-alerts behaviour, unsubscribe flow, and review-status alignment.

  • feat(fire-incident): add incident boundary utils and optimized country data ([#297 ]): Wires up full proximity-based incident detection and centre time-series tracking. Introduces DistanceCalculatorService (Turf.js) for great-circle distance and closest-incident resolution, IncidentMetadataService for parsing/initialising/updating centres (latest at index 0, capped at 100 entries), and SiteIncidentProximityService to orchestrate detection, creation, update, and alert association. Extends SiteIncidentRepository with findActiveIncidentsBySiteId and updateIncidentMetadata. Integrates the proximity service into SiteIncidentService to replace the previously commented-out logic, routing create/update decisions through proximity detection.

Biosphere - Wildfire - TypeScript
Published by rupamkairi 5 months ago

FireAlert - 2026-03-10

Introduces

Fire Incident

We are Introducing Fire Incident. We see Sending Notifications for the Alerts are not very efficient about what & how fires are moving in our sites, so going forward we are planning to group Fires to Send more meaningful notifications. [More Info].(https://www.notion.so/plantfortheplanet/Fire-Incident-Feature-Introduction-312372a41a4180b0b57fe874f2281b5f?source=copy_link)
This is the Version 1 Release there will be more Improvements to come on the way. So far We are only changing Email Notifications. Mobile apps will soon have a update. There won't be much significant updates other than Incident Details.

What's Changed

Full Changelog: https://github.com/Plant-for-the-Planet-org/FireAlert/compare/2025-12-30...2026-01-20

Biosphere - Wildfire - TypeScript
Published by rupamkairi 6 months ago

FireAlert - 2026-01-12

Overview

Improvements to OneSignal device synchronization and alert-method verification, plus minor UI fixes. Work includes a hotfix using legacy API credentials, a comprehensive OneSignal sync implementation on develop, and branch syncs to consolidate changes into main.

What's Changed

Features & Fixes

  • Update alert method device verification method (https://github.com/Plant-for-the-Planet-org/FireAlert/pull/257): Hotfix to the alert method router to use Legacy API credentials so server-side sync completes for device verification. Intended as a low-impact fix for issues #252 and #98; partially addressed the problem and was merged to main.
  • Feature: syncfix onesignal and minor UI fix (https://github.com/Plant-for-the-Planet-org/FireAlert/pull/258): Comprehensive enhancement of OneSignal integration with automatic device synchronization. Updated syncing of alert method for phone by retrieving SubscriptionId from OneSignal and syncing with AlertMethod through creation or updating operations. Includes enhanced push notification system with fixed initialization loop issue.
    • App version updated to 1.7.
    • Minor UI updates including bottom bar height fix for Android.
    • Protected area card hero image addition.
  • Syncing main with develop (https://github.com/Plant-for-the-Planet-org/FireAlert/pull/259): Synchronization of main into develop to keep branches consistent and incorporate hotfix changes; includes updates to notification service infrastructure and authentication handling.
  • Merge develop into main (https://github.com/Plant-for-the-Planet-org/FireAlert/pull/261): Final merge of develop into main to release consolidated OneSignal integration improvements and UI fixes into production.

PR Maps

Biosphere - Wildfire - TypeScript
Published by rupamkairi 8 months ago

FireAlert - 2025-12-30

Overview

Refactor and cleanup of the geo-event-fetcher implementation with accompanying steering documentation. The work reorganizes the event fetcher/handler code and adds docs to explain steering/configuration; the refactor was merged into the codebase.

What's Changed

Features & Fixes

PR Maps

Biosphere - Wildfire - TypeScript
Published by rupamkairi 8 months ago

FireAlert - 2025-12-22

What's Changed

Initially started with React Native Upgrade to 0.76.9 as it was the stable one version to move from older ones. Later React Native Upgrade to 0.81 as per mandatory Android 16 support from September 2025.

Few Important 3rd Party package upgrades - 


  1. react-native-auth0
  2. react-native-onesignal
  3. @rnmapbox/maps
  4. react-native-document-picker swapped with react-native-documents/picker
    The older packages that were compatible were kept as it is.

Support for Node version 22 to support Vercel's Node engine upgrade. as 18 reached EOL.

NextJS Upgrade to 15.5.
Updated Sentry Configurations.

React Native Upgrade (https://github.com/Plant-for-the-Planet-org/FireAlert/pull/230)
In-App Updates (https://github.com/Plant-for-the-Planet-org/FireAlert/pull/230): Later app will automatically detects if there is any updates in the store & prompt user to Update.
Protected Areas Mobile (merged internally - https://github.com/Plant-for-the-Planet-org/FireAlert/pull/193)
3rd Party Package Upgrades (https://github.com/Plant-for-the-Planet-org/FireAlert/pull/230)
Settings API (merged internally - https://github.com/Plant-for-the-Planet-org/FireAlert/pull/221, https://github.com/Plant-for-the-Planet-org/FireAlert/pull/220): APIs to display current status of the Alert Methods in the App.

Hotfixes
Notificaions CRON (https://github.com/Plant-for-the-Planet-org/FireAlert/pull/231, https://github.com/Plant-for-the-Planet-org/FireAlert/pull/234)
Index Additions (https://github.com/Plant-for-the-Planet-org/FireAlert/pull/233)

Biosphere - Wildfire - TypeScript
Published by rupamkairi 8 months ago

FireAlert - 2025-07-17

What's Changed

Natural Protected Areas

Protected Area Backend - https://github.com/Plant-for-the-Planet-org/FireAlert/pull/208 & https://github.com/Plant-for-the-Planet-org/FireAlert/pull/223

  • APIs for Protected Site Search, Create, Update.
  • Updates for CreateNotifications for these sites (since new site’s userId is linked through SiteRelation table).
  • Site.userId is no longer mandatory & necessary changes.

Protected Area Mobile - https://github.com/Plant-for-the-Planet-org/FireAlert/pull/193

  • Screens & UI For the Protected Areas
  • API Integration

Protected Area Data Import - https://github.com/Plant-for-the-Planet-org/FireAlert/pull/207

  • Added a script to automate importing the natural protected areas dataset into a PostgreSQL database.
  • Introduced a Dockerfile and Docker Compose configuration for containerized execution of the import process.
  • Prisma Schema changes + Migrations

Biosphere - Wildfire - TypeScript
Published by rupamkairi about 1 year ago

FireAlert - 2025-05-02

What's Changed

Notification Fixes

  • Updated disableCodes list
  • SMS & Whatsapp notification can be enabled using env variable switches. by default they are disabled due to some internal reasons.
  • New metadata & isSkipped field added, to store relevant informations for the notificaions.
  • Twilio Webhooks implemented
    • Initially sms status handled by existing logic
    • Upon handling Webhook's request metadata matches the twilio's status where isDelivered will be kept true if delivered status found else it will be turned to false.
  • Rewroked the Retry & Failure Handling
    • Max Retry is kept at 0 - means if fails to send notification won’t retry & skip.
    • On failed notification, method.failCount will be incremented & upon reaching a threshold method will be disabled.

Better handling of environment variables

  • Application will no longer require non-essential env variable to run, app will be able to run, but certain feature will be disabled & they will log accordingly.

Minor changes

  • Formatting, Type & Syntax fixes.
  • .prettierrc added for consistent formatting.

Full Changelog: https://github.com/Plant-for-the-Planet-org/FireAlert/compare/2025-03-25...2025-05-02

Biosphere - Wildfire - TypeScript
Published by rupamkairi over 1 year ago

FireAlert - 2025-03-25

What's Changed

Site Sync

Objectives

  1. For all projects that eligible for donations
  2. Bring those Projects & Users (& AlertMethods)
  3. Bring Sites of those Projects
  4. Enable monitoring for those Sites by default. If Site is deleted, dissociate from the project.

Cache Duration

Fixes Cache duration for previously released Fires API.
CDN Cache Control. 1 day
Browser cache 30 min
Corrected URL for caching

Biosphere - Wildfire - TypeScript
Published by rupamkairi over 1 year ago