{"id":"01a0baf7-969e-7b9b-b960-0f0f7094a062","slug":"kukuroo","name":"Kukuroo","oneLiner":"Self-hosted Web Push for iPhone, iPad and Mac Safari, triggered by one authenticated POST from scripts, cron or CI","logoUrl":"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Crect width='16' height='16' rx='3.4' fill='%230e2439'/%3E%3Cpath d='M2.3 14V6.4A2.6 2.6 0 0 1 4.9 3.8H11.1A2.6 2.6 0 0 1 13.7 6.4V14Z' fill='%234da3ff'/%3E%3Cpath d='M4.9 14V8.4A1.8 1.8 0 0 1 6.7 6.6H9.3A1.8 1.8 0 0 1 11.1 8.4V14Z' fill='%230e2439'/%3E%3Cpath d='M7 14V10.6A1 1 0 0 1 9 10.6V14Z' fill='%234da3ff'/%3E%3C/svg%3E","primaryCategory":{"slug":"messaging-notifications","name":"Messaging & Notifications"},"services":[{"slug":"workers","name":"Cloudflare Workers","shortName":"Workers"},{"slug":"kv","name":"Workers KV","shortName":"KV"}],"deploy":"cli","hasOneClick":false,"licenseName":"MIT","licenseClass":"open_source","freeTierStatus":"likely_sufficient","isTested":false,"lastTestedAt":null,"stars":129,"isArchived":false,"publishedAt":"2026-10-02T22:29:47.162Z","contentUpdatedAt":"2026-10-05T13:27:42.459Z","latestCommitAt":"2026-08-15T09:40:16Z","screenshot":{"url":"/media/apps/01a0baf7-969e-7b9b-b960-0f0f7094a062/01a0baf9-e539-7efb-92ff-fd8dd6c62189.png","alt":"Kukuroo homepage with an iPhone lock screen showing a \"Task W13 finished\" push notification"},"sourceHealth":"healthy","shortDescription":"Kukuroo turns one Cloudflare Worker and a KV namespace into a Web Push endpoint for Apple devices. Devices enroll in Safari through Declarative Web Push, and anything that can send an HTTP request can then notify them.","longDescription":"Safari displays Declarative Web Push notifications without a service worker. Once a device has opened the enrollment page and allowed notifications, a POST to /push/send with a bearer token reaches it. The deployment holds the VAPID keys, and the push service only relays encrypted payloads it cannot read.\n\nThe npx kukuroo init wizard writes a standalone Worker project and deploys it to a workers.dev address or a custom domain already on Cloudflare. Enrollment requires an invite code by default, and the same CLI later rotates the send token and the invite code.\n\nKukuroo can also be mounted inside an existing Worker, so the push routes share the site's origin and a notification click lands back in that site. The repository itself is a Claude Code plugin marketplace whose plugin lets a coding agent send a notification, for example when tests finish.","useCases":["Get a phone alert when a deploy, backup or CI job finishes","Send notifications from cron jobs and scripts without a chat bot","Add push routes to an existing Worker on the same origin","Let a coding agent notify you when a long task is done"],"targetAudience":"Developers with an iPhone, iPad or Mac who want push notifications from their own scripts, CI or Workers without a push vendor or a native app.","knownLimitations":"Receiving works only in Safari with Declarative Web Push: an iPhone or iPad on iOS 18.4 or later, or Safari 18.5 or later on macOS. Chrome, Firefox and Android cannot enroll. On iOS the page must be added to the Home Screen and opened from its icon. The enrollment origin is fixed once a device enrolls. A custom hostname needs a Worker route or a proxy that rewrites Host; a bare DNS CNAME does not work. kukuroo.credentials.json holds the only copy of the keys, and the VAPID keypair cannot be rotated.","editorialNote":null,"ownershipDisclosure":null,"homepageUrl":"https://kukuroo.cc","demoUrl":"https://demo.kukuroo.cc/","docsUrl":null,"repository":{"provider":"github","owner":"saiday","name":"kukuroo","url":"https://github.com/saiday/kukuroo","defaultBranch":"main","stars":129,"forks":5,"openIssues":2,"licenseSpdx":"MIT","isArchived":false,"latestRelease":"v0.1.3","latestReleaseAt":"2026-08-15T09:20:21Z","latestCommitAt":"2026-08-15T09:40:16Z","metadataFetchedAt":"2026-10-06T04:05:48.674Z"},"secondaryCategories":[],"servicesDetailed":[{"slug":"workers","name":"Cloudflare Workers","shortName":"Workers","detectionKind":"explicit","note":null},{"slug":"kv","name":"Workers KV","shortName":"KV","detectionKind":"explicit","note":null}],"connectors":[],"externalRequirements":[],"deployMethods":[{"id":"01a0baf8-f2b7-78df-9ba9-6be77698889d","methodType":"cli","url":null,"command":"npx kukuroo init my-push","docsUrl":"https://kukuroo.cc","branch":"main","isOneClick":false,"isPrimary":true,"requiredPlan":null,"notes":"The wizard generates the keys, creates the KV namespace and deploys. Back up my-push/kukuroo.credentials.json afterwards."}],"deployRequirements":[],"bindings":[{"bindingType":"kv_namespaces","bindingName":"KUKUROO_SUBS","resourceName":null}],"envVars":[],"screenshots":[{"id":"01a0baf9-f1ce-715c-aa90-b8c73c7d26f1","url":"/media/apps/01a0baf7-969e-7b9b-b960-0f0f7094a062/01a0baf9-e539-7efb-92ff-fd8dd6c62189.png","width":1440,"height":900,"altText":"Kukuroo homepage with an iPhone lock screen showing a \"Task W13 finished\" push notification","isPrimary":true,"sourceType":"capture"},{"id":"01a106ca-187b-7bfd-9750-b4d124f58d61","url":"/media/apps/01a0baf7-969e-7b9b-b960-0f0f7094a062/01a106ca-1735-7eed-a15f-73e7d34c3881.png","width":1440,"height":900,"altText":"Kukuroo homepage section with a curl request that sends a push notification and the npx kukuroo init setup command","isPrimary":false,"sourceType":"upload"}],"licenseUrl":"https://github.com/saiday/kukuroo/blob/ba21e705fa62803a35838391c29cde9c09bc6904/LICENSE","freeTierNote":"The project documents that Workers Free handles about 20 devices comfortably and 50 per send at most, set by the 50-subrequest limit per invocation with the 10 ms CPU budget close behind. Workers Paid raises the ceiling to 10,000 devices per send.","freeTierSourceUrl":"https://developers.cloudflare.com/workers/platform/limits/","freeTierCheckedAt":null,"setupComplexity":"low","setupComplexityNote":"Run npx kukuroo init and answer the prompts, then open the enrollment page on each device and allow notifications.","verification":{"status":"untested","testedAt":null,"versionRef":null,"deploymentMethod":null,"coreUseCase":null,"publicNote":null,"resources":[],"steps":[],"screenshots":[],"staleReason":null},"alternatives":[{"slug":"pushbullet","name":"Pushbullet"},{"slug":"pushover","name":"Pushover"}],"sources":[{"sourceType":"repository","url":"https://github.com/saiday/kukuroo","lastSeenAt":"2026-10-07T12:18:09.919Z"},{"sourceType":"homepage","url":"https://kukuroo.cc","lastSeenAt":"2026-10-06T04:06:07.345Z"},{"sourceType":"demo","url":"https://demo.kukuroo.cc/","lastSeenAt":"2026-10-03T23:36:35.346Z"}],"lastSourceRefreshAt":"2026-10-06T04:05:48.674Z","lastReviewedAt":"2026-10-02T22:29:47.162Z","seoTitle":"Kukuroo: self-hosted Web Push for iOS on Cloudflare","seoDescription":"Kukuroo is a self-hosted Web Push endpoint on a Cloudflare Worker and KV that lets any script send notifications to Apple devices enrolled through Safari.","changeEvents":[{"id":"01a0febc-e47f-7b38-845f-573618cd90df","kind":"listed","summary":"Kukuroo listed","createdAt":"2026-10-02T22:29:47.162Z","app":{"slug":"kukuroo","name":"Kukuroo"}}]}