Pushkin is a free open source tool for sending push notifications

Overview

Unmaintained

This repository is no longer maintained.

Pushkin

Build Status

Introduction

Pushkin is a free open source tool for sending push notifications. It was developed with a focus on speed and enabling fast experimentation. Pushkin was mainly built for supporting online mobile games, but can easily be extended to any type of application. It supports both Android and iOS platforms.

Pushkin is designed to be a responsive tool. You can design your systems around Pushkin so it reacts to your game server, database server, client or really any service that can send a HTTP POST request. It is also easily scalable, because you can run as many Pushkin instances as you want. One instance is capable of pushing 500 messages per second.

Pushkin has the MIT license.


Use cases

To fit all use cases, Pushkin has 2 modes of operations:

  1. Push Notification mode - You can issue a direct notification, meaning that you supply the user and the message. Pushkin will find the device id for the user and send the message. This is the simplest use case.

  2. Event mode - You can send Pushkin an event, notifying it that something happened to a certain user. Pushkin will then decide whether it can send a notification based on that event or not. If yes, Pushkin will construct the message in the proper language for the user (localization is supported), find the device id of the user mobile device and send the notification.

These two use cases can be seen on the diagram below:

highlevel

Comments
  • Make senders pluggable

    Make senders pluggable

    Now each sender is being loaded as plugin. This allows to explicitly load built-in senders (GCM and APN), as well as any number of own senders implementation (and therefore send arbitrary notifications like emails and chat messages).

    Senders are specified by config option enabled_senders. Each sender is represented with an importable path to sender class and optional kwargs (in JSON) following after a whitespace. Sender class must be a subclass of senders.NotificationSender.

    Example:

    enabled_senders =
      pushkin.sender.senders.ApnNotificationSender
      pushkin.sender.senders.GcmNotificationSender {"workers": 100}
      some.module.MySmtpSender {"workers": 10, "extra_argument": 42}
      some.module.MyChatSender
    
    opened by maretskiy 5
  • Alembic error: Can't locate revision identified by '34dd0bf00472'

    Alembic error: Can't locate revision identified by '34dd0bf00472'

    Hello, I'm trying to update the database to rise the server, but I'm receiving following error. I'd appreciate some help, I can't found what's the issue here.

    postgres@ar-sta023:/home/rodrigo/pushkin$ pushkin --configuration config.ini --upgrade-db INFO [alembic.runtime.migration] Context impl PostgresqlImpl. INFO [alembic.runtime.migration] Will assume transactional DDL. Traceback (most recent call last): File "/usr/local/bin/pushkin", line 11, in load_entry_point('pushkin==0.1.6.1', 'console_scripts', 'pushkin')() File "/var/lib/postgresql/.local/lib/python2.7/site-packages/pushkin/pushkin_cli.py", line 119, in main database.upgrade_database() File "/var/lib/postgresql/.local/lib/python2.7/site-packages/pushkin/database/database.py", line 55, in upgrade_database alembic_command.upgrade(alembic_cfg, "head") File "/var/lib/postgresql/.local/lib/python2.7/site-packages/alembic/command.py", line 254, in upgrade script.run_env() File "/var/lib/postgresql/.local/lib/python2.7/site-packages/alembic/script/base.py", line 425, in run_env util.load_python_file(self.dir, 'env.py') File "/var/lib/postgresql/.local/lib/python2.7/site-packages/alembic/util/pyfiles.py", line 93, in load_python_file module = load_module_py(module_id, path) File "/var/lib/postgresql/.local/lib/python2.7/site-packages/alembic/util/compat.py", line 75, in load_module_py mod = imp.load_source(module_id, path, fp) File "/var/lib/postgresql/.local/lib/python2.7/site-packages/pushkin/database/migrations/env.py", line 76, in run_migrations_online() File "/var/lib/postgresql/.local/lib/python2.7/site-packages/pushkin/database/migrations/env.py", line 71, in run_migrations_online context.run_migrations() File "", line 8, in run_migrations File "/var/lib/postgresql/.local/lib/python2.7/site-packages/alembic/runtime/environment.py", line 836, in run_migrations self.get_context().run_migrations(**kw) File "/var/lib/postgresql/.local/lib/python2.7/site-packages/alembic/runtime/migration.py", line 321, in run_migrations for step in self._migrations_fn(heads, self): File "/var/lib/postgresql/.local/lib/python2.7/site-packages/alembic/command.py", line 243, in upgrade return script._upgrade_revs(revision, rev) File "/var/lib/postgresql/.local/lib/python2.7/site-packages/alembic/script/base.py", line 338, in _upgrade_revs for script in reversed(list(revs)) File "/usr/lib/python2.7/contextlib.py", line 35, in exit self.gen.throw(type, value, traceback) File "/var/lib/postgresql/.local/lib/python2.7/site-packages/alembic/script/base.py", line 174, in _catch_revision_errors compat.raise_from_cause(util.CommandError(resolution)) File "/var/lib/postgresql/.local/lib/python2.7/site-packages/alembic/util/compat.py", line 128, in raise_from_cause reraise(type(exception), exception, tb=exc_tb) File "/var/lib/postgresql/.local/lib/python2.7/site-packages/alembic/script/base.py", line 143, in _catch_revision_errors yield File "/var/lib/postgresql/.local/lib/python2.7/site-packages/alembic/script/base.py", line 334, in _upgrade_revs revs = list(revs) File "/var/lib/postgresql/.local/lib/python2.7/site-packages/alembic/script/revision.py", line 642, in _iterate_revisions requested_lowers = self.get_revisions(lower) File "/var/lib/postgresql/.local/lib/python2.7/site-packages/alembic/script/revision.py", line 299, in get_revisions return sum([self.get_revisions(id_elem) for id_elem in id_], ()) File "/var/lib/postgresql/.local/lib/python2.7/site-packages/alembic/script/revision.py", line 304, in get_revisions for rev_id in resolved_id) File "/var/lib/postgresql/.local/lib/python2.7/site-packages/alembic/script/revision.py", line 304, in for rev_id in resolved_id) File "/var/lib/postgresql/.local/lib/python2.7/site-packages/alembic/script/revision.py", line 359, in _revision_for_ident resolved_id) alembic.util.exc.CommandError: Can't locate revision identified by '34dd0bf00472'

    opened by rodrigoic23 4
  • Bump protobuf from 2.6.1 to 3.15.0

    Bump protobuf from 2.6.1 to 3.15.0

    Bumps protobuf from 2.6.1 to 3.15.0.

    Release notes

    Sourced from protobuf's releases.

    Protocol Buffers v3.15.0

    Protocol Compiler

    • Optional fields for proto3 are enabled by default, and no longer require the --experimental_allow_proto3_optional flag.

    C++

    • MessageDifferencer: fixed bug when using custom ignore with multiple unknown fields
    • Use init_seg in MSVC to push initialization to an earlier phase.
    • Runtime no longer triggers -Wsign-compare warnings.
    • Fixed -Wtautological-constant-out-of-range-compare warning.
    • DynamicCastToGenerated works for nullptr input for even if RTTI is disabled
    • Arena is refactored and optimized.
    • Clarified/specified that the exact value of Arena::SpaceAllocated() is an implementation detail users must not rely on. It should not be used in unit tests.
    • Change the signature of Any::PackFrom() to return false on error.
    • Add fast reflection getter API for strings.
    • Constant initialize the global message instances
    • Avoid potential for missed wakeup in UnknownFieldSet
    • Now Proto3 Oneof fields have "has" methods for checking their presence in C++.
    • Bugfix for NVCC
    • Return early in _InternalSerialize for empty maps.
    • Adding functionality for outputting map key values in proto path logging output (does not affect comparison logic) and stop printing 'value' in the path. The modified print functionality is in the MessageDifferencer::StreamReporter.
    • Fixed protocolbuffers/protobuf#8129
    • Ensure that null char symbol, package and file names do not result in a crash.
    • Constant initialize the global message instances
    • Pretty print 'max' instead of numeric values in reserved ranges.
    • Removed remaining instances of std::is_pod, which is deprecated in C++20.
    • Changes to reduce code size for unknown field handling by making uncommon cases out of line.
    • Fix std::is_pod deprecated in C++20 (#7180)
    • Fix some -Wunused-parameter warnings (#8053)
    • Fix detecting file as directory on zOS issue #8051 (#8052)
    • Don't include sys/param.h for _BYTE_ORDER (#8106)
    • remove CMAKE_THREAD_LIBS_INIT from pkgconfig CFLAGS (#8154)
    • Fix TextFormatMapTest.DynamicMessage issue#5136 (#8159)
    • Fix for compiler warning issue#8145 (#8160)
    • fix: support deprecated enums for GCC < 6 (#8164)
    • Fix some warning when compiling with Visual Studio 2019 on x64 target (#8125)

    Python

    • Provided an override for the reverse() method that will reverse the internal collection directly instead of using the other methods of the BaseContainer.
    • MessageFactory.CreateProtoype can be overridden to customize class creation.

    ... (truncated)

    Commits
    • ae50d9b Update protobuf version
    • 8260126 Update protobuf version
    • c741c46 Resovled issue in the .pb.cc files
    • eef2764 Resolved an issue where NO_DESTROY and CONSTINIT were in incorrect order
    • 0040102 Updated collect_all_artifacts.sh for Ubuntu Xenial
    • 26cb6a7 Delete root-owned files in Kokoro builds
    • 1e924ef Update port_def.inc
    • 9a80cf1 Update coded_stream.h
    • a97c4f4 Merge pull request #8276 from haberman/php-warning
    • 44cd75d Merge pull request #8282 from haberman/changelog
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 1
  • iOs issue, Connection to APN lost

    iOs issue, Connection to APN lost

    Hello everyone, the notifications for android are awesome, but I can't send it for iOs. /var/log/pushkin/pushkin.log says this:

    2017-10-25 17:02:17,902 ERROR Connection to APN lost, reconnecting and trying again Traceback (most recent call last): File "/usr/local/lib/python2.7/dist-packages/pushkin-0.1.6.1-py2.7.egg/pushkin/sender/nordifier/pyapn2/client.py", line 48, in send_notification stream_id = self.__connection.request('POST', url, json_payload, headers) File "/usr/local/lib/python2.7/dist-packages/hyper/http20/connection.py", line 281, in request self.endheaders(message_body=body, final=True, stream_id=stream_id) File "/usr/local/lib/python2.7/dist-packages/hyper/http20/connection.py", line 546, in endheaders stream = self._get_stream(stream_id) File "/usr/local/lib/python2.7/dist-packages/hyper/http20/connection.py", line 289, in _get_stream raise StreamResetError("Stream forcefully closed") StreamResetError: Stream forcefully closed

    Here is my config.ini:

    [ServerSpecific]

    Name of your application

    game = PromoGo

    Id of pushkin instance

    world_id = 1

    Default API port

    port = 8887

    [Messenger]

    if true, gcm clients will not receive notifications

    dry_run = false

    max batch size for apn notifications

    apns_batch_size = 500

    apns_topic = PromoGo apns_certificate_path = /home/promogo/pushkin/prod_push_nopass.pem gcm_access_key = AAAAOfz579c:APA91bF8ekMFcL5P6AfzKYKk4nb_flPif1bLHgEc1zaxHxwK97T311Ln5Kk-orEs9JbOrayFpztI-CtOvBTiY9rde-KphsAA_yREX7MM2qIPISldJm$

    for future use

    apns_sandbox = false connection_error_retries = 3

    Baselink for your application sent with push notifications

    base_deeplink_url = application_name.com

    [RequestProcessor]

    queue limit for requests processor. See Monitoring API for reference

    queue_limit = 50000

    Number of threads for request processor

    request_processor_num_threads = 10

    [Sender]

    queue limit for sender processor. See Monitoring API for reference

    sender_queue_limit = 50000

    enabled_senders = pushkin.sender.senders.ApnNotificationSender {"workers": 50} pushkin.sender.senders.GcmNotificationSender {"workers": 50}

    [Log]

    log configuration

    main_logger_name = pushkin main_log_path = /var/log/pushkin/ notifications_logger_name = notifications notification_log_path = /var/log/pushkin/notification/ notification_log_when_to_rotate = H notification_log_rotate_suffix = %Y-%m-%d_%H

    notset, debug, info, warning, error, critical

    main_log_level = DEBUG keep_log_days = 7

    [Database]

    database credentials

    to use unix socket set this to socket directory path

    db_host = localhost db_port = 5432 db_user = pushkin db_name = pushkin db_pass = pushkin db_pool_size = 20 max_devices_per_user = 10 max_users_per_device = 1 [Event]

    event id of prebuilt login event

    login_event_id = 4001 turn_off_notification_event_id = 4006

    [RequestHandler]

    URLs for all request handlers

    proto_event_handler_url = /post_events_proto proto_notification_handler_url = /post_notification_proto json_event_handler_url = /post_events_json json_notification_handler_url = /post_notification_json request_queue_handler_url = /get_request_queue apn_sender_queue_handler_url = /get_apn_sender_queue gcm_sender_queue_handler_url = /get_gcm_sender_queue notification_post_processor_queue_handler_url = /get_notification_post_processor_queue

    Could someone give me any clue? I'm not experienced with python, maybe it's a simple issue, but I can't figure it out.

    Thank you.

    opened by rodrigoic23 1
  • Limit login ids per device

    Limit login ids per device

    Currently if more than one login id is registered on a single device push notifications for every login id will be sent to that device. This is usually not desired and should be configurable.

    opened by korhner 0
  • Make it possible to select notification priority

    Make it possible to select notification priority

    If notifications have no priority set, they will take normal priority and that will result in notification delay during Doze and App Standby on Android device. To overcome this priority has to be set to high for notifications that have to be received at some exact time.

    Documentation on this: https://developers.google.com/cloud-messaging/concept-options#setting-the-priority-of-a-message

    enhancement 
    opened by dusanst 0
  • Bump protobuf from 2.6.1 to 3.18.3

    Bump protobuf from 2.6.1 to 3.18.3

    Bumps protobuf from 2.6.1 to 3.18.3.

    Release notes

    Sourced from protobuf's releases.

    Protocol Buffers v3.18.3

    C++

    Protocol Buffers v3.16.1

    Java

    • Improve performance characteristics of UnknownFieldSet parsing (#9371)

    Protocol Buffers v3.18.2

    Java

    • Improve performance characteristics of UnknownFieldSet parsing (#9371)

    Protocol Buffers v3.18.1

    Python

    • Update setup.py to reflect that we now require at least Python 3.5 (#8989)
    • Performance fix for DynamicMessage: force GetRaw() to be inlined (#9023)

    Ruby

    • Update ruby_generator.cc to allow proto2 imports in proto3 (#9003)

    Protocol Buffers v3.18.0

    C++

    • Fix warnings raised by clang 11 (#8664)
    • Make StringPiece constructible from std::string_view (#8707)
    • Add missing capability attributes for LLVM 12 (#8714)
    • Stop using std::iterator (deprecated in C++17). (#8741)
    • Move field_access_listener from libprotobuf-lite to libprotobuf (#8775)
    • Fix #7047 Safely handle setlocale (#8735)
    • Remove deprecated version of SetTotalBytesLimit() (#8794)
    • Support arena allocation of google::protobuf::AnyMetadata (#8758)
    • Fix undefined symbol error around SharedCtor() (#8827)
    • Fix default value of enum(int) in json_util with proto2 (#8835)
    • Better Smaller ByteSizeLong
    • Introduce event filters for inject_field_listener_events
    • Reduce memory usage of DescriptorPool
    • For lazy fields copy serialized form when allowed.
    • Re-introduce the InlinedStringField class
    • v2 access listener
    • Reduce padding in the proto's ExtensionRegistry map.
    • GetExtension performance optimizations
    • Make tracker a static variable rather than call static functions
    • Support extensions in field access listener
    • Annotate MergeFrom for field access listener
    • Fix incomplete types for field access listener
    • Add map_entry/new_map_entry to SpecificField in MessageDifferencer. They record the map items which are different in MessageDifferencer's reporter.
    • Reduce binary size due to fieldless proto messages
    • TextFormat: ParseInfoTree supports getting field end location in addition to start.

    ... (truncated)

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • Params (or pairs) on post_notification_json endpoint

    Params (or pairs) on post_notification_json endpoint

    Hi! I was using this library and it's great. I'm sending notifications like this

    const notifications = await usuarios.map(u => { return { login_id: u.id, title: notificacion.titulo, content: notificacion.mensaje, screen: 'home' } })

    enviado = http.post('/post_notification_json', JSON.stringify({ events: notifications })) .then(() => true) .catch((err) => { logger.info('No se pudo enviar la notificacion: ' + err.message) return false })

    The question is, is there any way to add custom params, like 'pairs' param on post_events_json endpoint?

    Thank you so much

    opened by rodrigoic23 0
  • Create missing error codes for apn client

    Create missing error codes for apn client

    After switching to new library for APN Pushkin logs status for Unregistered error only. For other errors status remains on -1 (ready) and that one is logged.

    opened by dprokic 0
Releases(v0.1.6.1)
  • v0.1.6.1(Jan 31, 2017)

    • Fixed memory leak in APN client that was causing memory to grow after every notification sent
    • Added Automatic APN client reconnect when connection was reset remotely by APN. This can happen due to inactivity, network problems or APN service being offline. Before this update, the problem required pushkin restart to be fixed.
    Source code(tar.gz)
    Source code(zip)
  • v0.1.6(Dec 30, 2016)

    New APN library which allowed to switch to new Apple API for Push notifications (HTTP/2). Made changes so multiple Pushkin instances can use a single database, if needed. In previous versions, if you used multiple instances additional logic was necessary to determine the Pushkin instance which has information on the user that has to receive the push notification. This is not the case now, since the data can be shared. Following this, we advise installing a load balancer in production if you have multiple Pushkin instances, to fully use the benefits of this release.
    The centralized database update introduced some useful side effects:

    • RequestProcessor is now a process pool instead of ThreadPool, this will lead to increased performance.
    • Eliminated PostgreSQL HStore dependency.

    Since RequestProcessor is now a process pool and SQLAlchemy connection pool cannot be shared in forked processes we had to turn it off. It is advised that in production you use an external connection pool, such as PgBouncer. If you choose not to use PgBouncer this doesn't mean your performance will suffer in comparison to previous version of Pushkin. A boost in performance is to be expected either way.

    Source code(tar.gz)
    Source code(zip)
Owner
Nordeus
Nordeus
Push notifications allow developers to reach users, even when users aren't actively using an app!

Push notifications allow developers to reach users, even when users aren't actively using an app! With the latest update of iOS Apple provide very useful extensions which are user-friendly. In this tutorial, I am going to share the configuration, set up of Notification with the media attachments like.

MindInventory 16 Mar 3, 2022
Joseph Miller 0 Jan 7, 2022
๐Ÿคจ Apple Push Notification service tutorial

APNsTutorial-iOS ?? Apple Push Notification service tutorial ๋‹จ์ˆœํžˆ ์ˆœ์„œ๋ฅผ ๋”ฐ๋ผ์„œ ๊ฐ€๋ฉด ๋  ์ค„ ์•Œ์•˜๋Š”๋ฐ ์•Œ์•„์•ผํ•  ๊ฒƒ๋„ ์žˆ์—ˆ๊ณ  ๊ฒฝ์šฐ์— ๋”ฐ๋ผ์„œ ์š”๊ตฌํ•˜๋Š” ํŒŒ์ผ๋„ ๋‹ฌ๋ž๋‹ค. ๊ทธ๋Ÿฌ๋‹ˆ ์ฒœ์ฒœํžˆ ์ฝ์–ด์ฃผ์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๋จผ์ € ์–ด๋–ค ์„œ๋ฒ„ ํ™˜๊ฒฝ

Hyungyu Kim 11 Dec 28, 2022
How to Add Local Push Notification With timeInterval & Test On Simulator

Technicalisto How to Add Local Push Notification With timeInterval & Test On Simulator In Project Target ( Signing & Capapilities ) Add Capapility : 1

Aya Baghdadi 0 Jun 24, 2022
Push Notification Registration for iOS

Orbiter Note: This project is no longer being maintained. For most iOS client / server applications, push notifications are negotiated through an inte

Mattt 672 Nov 17, 2022
The debug application for Apple Push Notification Service (APNs).

Knuff The debug application for Apple Push Notification Service (APNs). Download the latest version Features Send push notifications to APNS (Apple Pu

Knuff 5.2k Dec 26, 2022
OS X and iOS application and framework to play with the Apple Push Notification service (APNs)

Pusher OS X and iOS application and framework to play with the Apple Push Notification service (APNs) Installation Install the Mac app using Homebrew

noodlewerk 6.2k Dec 22, 2022
APNSUtil is makes code simple using apple push notification service

APNSUtil APNSUtil makes code simple settings and landing for apple push notification service. Features Using apple push notification service simply No

Steve Kim 30 Mar 24, 2022
A Swift Library for Dynamic Island Push Notification.

Push Notification With Dynamic Island Handle Push Notification with Dynamic Island ?? Descreption: Since there is not library for Apple Push Notificat

Amir Diafi 5 Nov 12, 2022
Facebook Analytics In-App Notifications Framework

Facebook In-App Notifications enables you to create rich and customizable in-app notifications and deliver them via push notifications, based on the a

Meta Archive 496 Nov 17, 2022
Library to send mock remote notifications to the iOS simulator

SimulatorRemoteNotifications SimulatorRemoteNotifications is a library to send mock remote notifications to the iOS simulator. The library extends UIA

Arnaud Coomans 1.4k Dec 20, 2022
Easily create Local Notifications in swift - Wrapper of UserNotifications Framework

In IOS 10, apple updated their library for Notifications and separated Local and push notifications to a new framework: User Notifications This librar

Devesh Laungani 208 Dec 14, 2022
See all your scheduled local notifications in one place

ScheduledNotificationsViewController Nice Photon is available for hire! Talk to

Nice Photon 171 Oct 8, 2022
Custom in-app notifications.

CRNotifications CRNotifications are custom in-app notifications with 3 types of layouts. The notifications will animate in and out. They will hide whe

Casper Riboe 112 Sep 2, 2022
Gently notifies you about 'important' GitHub notifications

OctoBlast Gently notifies you about important GitHub notifications Setup Personal access token Head to preferences, and pop in your a new GitHub perso

Jason Watson 6 Nov 14, 2022
OS X app for sending push with Apple Push Notification service (APNs)

pushHandle OS X app for sending push with Apple Push Notification service (APNs) About This app was created just to allow painless testing of push not

hbk3 3 Nov 17, 2022
Push Hero - pure Swift native macOS application to test push notifications

Dropdowns โค๏ธ Support my app โค๏ธ Push Hero - pure Swift native macOS application to test push notifications Quick Access - Organise files in the Mac men

Khoa 307 Oct 17, 2022
'Minimalistic Push' is a minimalistic push-up application now built with Flutter.

Minimalistic Push Minimalistic Push is one of the simplest push-up trackers out there. You can track your push-ups in the training mode and see an ove

Jonas Poxleitner 10 Dec 29, 2022
Apple Push Notifications (APNs) Server-Side library.

Perfect-Notifications ็ฎ€ไฝ“ไธญๆ–‡ APNs remote Notifications for Perfect. This package adds push notification support to your server. Send notifications to iO

PerfectlySoft Inc. 113 Oct 28, 2022
A SwiftUI iOS App and Vapor Server to send push notifications fueled by Siri Shortcuts.

Puffery An iOS App written in SwiftUI to send push notifications fueled by Siri Shortcuts. You can follow other's channels and directly receive update

Valentin Knabel 29 Oct 17, 2022