{"id":19521450,"url":"https://github.com/vknabel/puffery","last_synced_at":"2025-06-14T21:38:33.163Z","repository":{"id":43534987,"uuid":"258876511","full_name":"vknabel/puffery","owner":"vknabel","description":"A SwiftUI iOS App and Vapor Server to send push notifications fueled by Siri Shortcuts.","archived":false,"fork":false,"pushed_at":"2024-02-09T07:55:17.000Z","size":60591,"stargazers_count":50,"open_issues_count":2,"forks_count":10,"subscribers_count":4,"default_branch":"main","last_synced_at":"2025-06-05T15:04:20.899Z","etag":null,"topics":["example-project","hacktoberfest","ios-app","shortcuts","swift","swiftui","vapor","vapor-swift"],"latest_commit_sha":null,"homepage":"https://apps.apple.com/de/app/puffery/id1508776889","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/vknabel.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":"vknabel","custom":["https://www.paypal.me/valentinknabel"]}},"created_at":"2020-04-25T21:18:59.000Z","updated_at":"2025-05-27T05:28:59.000Z","dependencies_parsed_at":"2024-11-11T00:32:27.443Z","dependency_job_id":"12d16fb7-2b25-457e-a17d-1fd08561469f","html_url":"https://github.com/vknabel/puffery","commit_stats":null,"previous_names":[],"tags_count":11,"template":false,"template_full_name":null,"purl":"pkg:github/vknabel/puffery","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vknabel%2Fpuffery","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vknabel%2Fpuffery/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vknabel%2Fpuffery/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vknabel%2Fpuffery/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/vknabel","download_url":"https://codeload.github.com/vknabel/puffery/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vknabel%2Fpuffery/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":259888122,"owners_count":22927061,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["example-project","hacktoberfest","ios-app","shortcuts","swift","swiftui","vapor","vapor-swift"],"created_at":"2024-11-11T00:32:17.752Z","updated_at":"2025-06-14T21:38:33.121Z","avatar_url":"https://github.com/vknabel.png","language":"Swift","funding_links":["https://github.com/sponsors/vknabel","https://www.paypal.me/valentinknabel"],"categories":[],"sub_categories":[],"readme":"# Puffery\n\nAn iOS App written in SwiftUI to send push notifications fueled by Siri Shortcuts.\n\nYou can follow other's channels and directly receive updates.\nThere is no algorithm deciding wether you should receive notifications or not.\n\n![](./assets/Sceenshot-iPhoneX.png)\n\n[![Download on the App Store](./assets/Download_on_the_App_Store_Badge.svg)](https://apps.apple.com/de/app/puffery/id1508776889)\n\n[Join the public beta on TestFlight](https://testflight.apple.com/join/066lEjQN).\n\nDo you want to stay up to date with Puffery-dev-builds? [There is a channel for that!](puffery://puffery.app/channels/subscribe/70D2A779-2829-4DD0-93BC-C695E5E1EBE7)\n\nDo you need inspiration or help? Head over to [our GitHub discussions](https://github.com/vknabel/puffery/discussions)!\n\n## Server-Configuration\n\n| env                           | Description                                           | Default                                                            |\n| ----------------------------- | ----------------------------------------------------- | ------------------------------------------------------------------ |\n| `DATABASE_URL`                | Connection string for SQL Database.                   | `postgres://puffery-test:puffery-test@localhost:5431/puffery-test` |\n| `REDIS_URL`                   | Connection string for Queues.                         | `redis://localhost:6378`                                           |\n| `PUFFERY_IN_PROCESS_JOBS`     | Runs jobs inside the server.                          | `false`                                                            |\n| `APNS_KEY_ID`                 | Key ID for Auth Key.                                  | Only required for push notifications                               |\n| `APNS_TEAM_ID`                | Team ID for Auth Key.                                 | Only required for push notifications                               |\n| `APNS_KEY_PATH`               | Path to private auth key for APNS.                    | `private/AuthKey_$APNS_KEY_ID.p8`                                  |\n| `APNS_ENVIRONMENT`            | Path to private auth key for APNS.                    | `production`                                                       |\n| `SENDGRID_API_KEY`            | API Key for sending emails.                           | Only required for emails                                           |\n| `PUFFERY_STATISTICS_CHANNELS` | Comma separated list of notify keys to receive stats. | `[]`                                                               |\n\n## Run Server\n\n```bash\n$ cd PufferyServer\n$ swift run puffery serve --hostname 0.0.0.0 --auto-migrate\n```\n\nTo access your server from the mobile app add `127.0.0.1 local.puffery.app` to `/etc/hosts` and select the `Puffery (Local)` scheme.\n\n## API-Routes\n\n```\n$ cd PufferyServer \u0026\u0026 swift run puffery routes\n+--------+----------------------------------------------+\n| GET    | /                                            |\n+--------+----------------------------------------------+\n| GET    | /hello                                       |\n+--------+----------------------------------------------+\n| POST   | /api/v1/register                             |\n+--------+----------------------------------------------+\n| POST   | /api/v1/login                                |\n+--------+----------------------------------------------+\n| POST   | /api/v1/confirmations/login/:confirmation_id |\n+--------+----------------------------------------------+\n| POST   | /api/v1/confirmations/email/:confirmation_id |\n+--------+----------------------------------------------+\n| GET    | /api/v1/profile                              |\n+--------+----------------------------------------------+\n| PUT    | /api/v1/profile                              |\n+--------+----------------------------------------------+\n| POST   | /api/v1/devices                              |\n+--------+----------------------------------------------+\n| PUT    | /api/v1/devices/:device_token                |\n+--------+----------------------------------------------+\n| POST   | /api/v1/channels                             |\n+--------+----------------------------------------------+\n| GET    | /api/v1/channels/:subscription_id            |\n+--------+----------------------------------------------+\n| POST   | /api/v1/channels/:subscription_id            |\n+--------+----------------------------------------------+\n| DELETE | /api/v1/channels/:subscription_id            |\n+--------+----------------------------------------------+\n| GET    | /api/v1/channels                             |\n+--------+----------------------------------------------+\n| GET    | /api/v1/channels/shared                      |\n+--------+----------------------------------------------+\n| GET    | /api/v1/channels/own                         |\n+--------+----------------------------------------------+\n| POST   | /api/v1/notify-inbound-email                 |\n+--------+----------------------------------------------+\n| POST   | /api/v1/notify/:notify_key                   |\n+--------+----------------------------------------------+\n| POST   | /notify/:notify_key                          |\n+--------+----------------------------------------------+\n| GET    | /api/v1/channels/messages                    |\n+--------+----------------------------------------------+\n| GET    | /api/v1/channels/:subscription_id/messages   |\n+--------+----------------------------------------------+\n| POST   | /api/v1/channels/:subscription_id/messages   |\n+--------+----------------------------------------------+\n| POST   | /api/v1/channels/subscribe                   |\n+--------+----------------------------------------------+\n```\n\n## License\n\nPuffery is available under the [MIT](./LICENSE) license.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvknabel%2Fpuffery","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvknabel%2Fpuffery","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvknabel%2Fpuffery/lists"}