{"id":"agent-push-notifications","slug":"agent-push-notifications","name":"Mobile push notifications for agents","shortName":"Agent push","problemStatement":"Notify humans on iOS/Android when agents need input or finish long jobs — without building APNs/FCM infrastructure.","whenNotTopPick":"Multi-channel orchestration (Knock/Courier/Novu) matters more than raw push.","categoryIds":["cat-comms"],"depotPickProviderId":"onesignal","depotPickRationale":"Comms. Confidence: high.","runnersUpIds":["knock","novu","courier"],"weights":{"capabilityFit":0.22,"pricePerformance":0.14,"latencyReliability":0.14,"developerDx":0.28,"privacyPosture":0.08,"lockInRisk":0.06,"maturity":0.08},"methodologyNotes":"Comms. Confidence: high.","tags":["push","mobile","notifications","hitl"],"depth":{"whenNotToUse":{"text":"Multi-channel orchestration (Knock/Courier/Novu) matters more than raw push.","source":"editorial `whenNotTopPick` (data/jtbds.json)"},"whenNotToUseReason":null,"runnerUp":{"providerId":"knock","name":"Knock","overallForJob":8.36,"pickOverallForJob":8.08,"beatsPickOn":["capabilityFit","developerDx","privacyPosture"],"source":"first resolvable entry of the job's editorially ranked `runnersUpIds`; scores are stored job-weighted scores"},"runnerUpReason":null,"lockIn":{"pickLockInRisk":4.8,"runnerUpLockInRisk":5,"scale":"0–10 stored curated estimate; higher = more lock-in (worse)","pickExitSignals":[],"runnerUpExitSignals":[],"pickNotes":[],"selfHostFallback":[{"id":"ntfy","name":"ntfy","license":"Apache-2.0","sourceUrl":"https://raw.githubusercontent.com/binwiederhier/ntfy/main/LICENSE"}],"migration":"The pick has lower stored lock-in risk than runner-up Knock (4.8 vs 5). Self-host fallback listed for this job: ntfy.","migrationReason":null,"derivedFrom":"stored lockInRisk scores, provider tags (oss, self-host, openai-compat, open-models), free rows that list this job, and verbatim provider notes. No migration guide was invented."}},"freshness":{"pick":{"score":{"asOf":"2026-09-14","ageDays":43,"stale":true,"staleAfterDays":30,"reason":null},"lastReviewed":{"asOf":"2026-09-14","ageDays":43,"stale":true,"staleAfterDays":30,"reason":null},"sourceCheck":{"checkedAt":"2026-10-27","sourceUrls":2,"sourcesReachable":2,"pricingRows":5,"pricingRowsReconfirmed":2,"note":"A source re-check confirms the page is reachable and, for pricing rows, that the stored amount and SKU name appear on it. It does not re-derive or change the score.","reason":null}}}}