All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
0.5.0 - 2026-01-22
Added
- Web Push support for browsers:
- FCM Web Push (Chrome, Firefox, Edge) - same API as mobile
- Safari Web Push (macOS) via APNS with
web.topic prefix
PushX.FCM.web_notification/4- Create web push payloads with click actionPushX.FCM.send_web/5- Convenience function for web notificationsPushX.APNS.web_notification/4- Safari web push payloads with URL argsPushX.APNS.web_notification_with_data/5- Safari web push with custom data- 20 new tests for web push functionality
- Total test count: 205 tests
Changed
- FCM token validation now accepts shorter web tokens (min 20 chars, was 100)
- Updated Finch dependency to
~> 0.21 - Updated documentation with Web Push examples
0.4.1 - 2026-01-22
Added
- Expanded Config module test coverage to 100% (24 new tests)
- Total test count: 185 tests
0.4.0 - 2026-01-22
Added
- Batch sending — send to multiple tokens concurrently with configurable parallelism
PushX.push_batch/4- Returns list of{token, result}tuplesPushX.push_batch!/4- Returns summary%{success: n, failure: n, total: n}PushX.APNS.send_batch/3andPushX.FCM.send_batch/3for direct provider access- Configurable
:concurrency(default: 50) and:timeout(default: 30s) options
- Token validation — validate token format before sending
PushX.validate_token/2- Returns:okor{:error, reason}PushX.valid_token?/2- Returns booleanPushX.Tokenmodule with validation for APNS (64 hex chars) and FCM (100-500 chars) tokens:validate_tokensoption for batch sending to filter invalid tokens
- Rate limiting — optional client-side rate limiting
PushX.check_rate_limit/1- Check if under rate limitPushX.RateLimitermodule with sliding window algorithm- Configurable per-provider limits via config
- Automatic rate limit check before each request (when enabled)
Changed
- Updated README with batch sending, token validation, and rate limiting documentation
- Removed completed items from roadmap
0.3.3 - 2026-01-22
Fixed
- Fixed release workflow cache conflict with ex_doc
0.3.2 - 2026-01-22 [YANKED]
Fixed
- Fixed code formatting in retry tests
0.3.1 - 2026-01-22 [YANKED]
Fixed
- Fixed release workflow to use MIX_ENV=dev for ex_doc availability
0.3.0 - 2026-01-22 [YANKED]
Added
- Telemetry integration with events for monitoring push notification delivery:
[:pushx, :push, :start]- Request started[:pushx, :push, :stop]- Request succeeded[:pushx, :push, :error]- Request failed[:pushx, :push, :exception]- Exception raised[:pushx, :retry, :attempt]- Retry attempted
PushX.Telemetrymodule with documentation and examplestelemetry ~> 1.3dependency- Comprehensive retry and telemetry test suites (116 total tests)
- Credential rotation documentation in README
- Retry configuration documentation in README
Changed
- Made all examples generic (removed domain-specific references)
- Updated README with telemetry usage examples and Telemetry.Metrics integration
0.2.4 - 2026-01-22
Added
- Comprehensive API reference documentation with all functions, options, and types
- Credential storage options guide (filesystem, env vars, Fly.io, AWS Secrets Manager)
0.2.3 - 2026-01-22
Added
- GitHub Actions CI workflow (tests on Elixir 1.18/1.19 with OTP 26-28)
- APNS and FCM credential setup guides
- Roadmap and contributing sections
Changed
- Updated Finch dependency to
~> 0.20 - Improved CI with code quality checks, security audit, and unused deps check
- Clarified test key comment to avoid false positive security alerts
0.2.2 - 2026-01-12
Added
- Added CHANGELOG.md with full version history
- Added Changelog link to hex.pm package
0.2.1 - 2026-01-12
Fixed
- Fixed CI workflow for documentation generation
- Fixed code formatting issues
Changed
- Updated documentation examples to use generic messaging
0.2.0 - 2026-01-12
Added
- Automatic retry with exponential backoff following Apple/Google best practices
PushX.Retrymodule for retry logicsend_once/3functions for APNS and FCM (single attempt without retry)retry_afterfield inPushX.Responsestructretryable?/1helper function inPushX.Response- Configuration options for retry behavior:
retry_enabled- Enable/disable retry (default:true)retry_max_attempts- Maximum retry attempts (default:3)retry_base_delay_ms- Base delay in milliseconds (default:10_000)retry_max_delay_ms- Maximum delay in milliseconds (default:60_000)
Fixed
- Fixed APNS sandbox URL (
api.sandbox.push.apple.com)
0.1.1 - 2026-01-09
Fixed
- Initial bug fixes and improvements
0.1.0 - 2026-01-09
Added
- Initial release
- APNS (Apple Push Notification Service) support with JWT authentication
- FCM (Firebase Cloud Messaging) support with OAuth2 via Goth
- Unified API for both providers (
PushX.push/4) - Message builder API (
PushX.Message) - Structured response handling (
PushX.Response) - HTTP/2 connections via Finch
- Zero external JSON dependency (uses Elixir 1.18+ built-in JSON)