{"_id":"@braedonsaunders/appkit-notifications","_rev":"2-deb520f4023c8709b21edb070156c605","name":"@braedonsaunders/appkit-notifications","dist-tags":{"latest":"3.0.0"},"versions":{"2.0.0":{"name":"@braedonsaunders/appkit-notifications","version":"2.0.0","keywords":["appkit","application-framework","typescript"],"author":{"name":"Braedon Saunders"},"license":"AGPL-3.0-or-later","_id":"@braedonsaunders/appkit-notifications@2.0.0","maintainers":[{"name":"braedonsaunders","email":"bsaunders@rassaun.com"}],"homepage":"https://github.com/braedonsaunders/appkit/tree/main/packages/notifications#readme","bugs":{"url":"https://github.com/braedonsaunders/appkit/issues"},"dist":{"shasum":"b834e031cabad45b0c7a390c683c5171a8a923ee","tarball":"https://registry.npmjs.org/@braedonsaunders/appkit-notifications/-/appkit-notifications-2.0.0.tgz","fileCount":58,"integrity":"sha512-o392OzAj3JHHKyk39cUsYbLtbpbKOCJ2CQP0yHRdDpqR01ucTES+E3rcCsAQGRZRQTX4zAbKuPUIKhTfrJlQDA==","signatures":[{"sig":"MEQCIFNge7C4cIDy86ndoJXCqJJAPhi7bYkt6zJvNcPdJTdMAiBhGOKjgVTNA4hLkGDr4jRdltsDRFldVa5LsfuELPZWkg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@braedonsaunders%2fappkit-notifications@2.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":468531},"main":"./index.js","type":"module","_from":"file:braedonsaunders-appkit-notifications-2.0.0.tgz","types":"./index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./index.d.ts","import":"./index.js","default":"./index.js"},"./push":{"types":"./push.d.ts","import":"./push.js","default":"./push.js"},"./react":{"types":"./react.d.ts","import":"./react.js","default":"./react.js"},"./digest":{"types":"./digest.d.ts","import":"./digest.js","default":"./digest.js"},"./schema":{"types":"./schema.d.ts","import":"./schema.js","default":"./schema.js"},"./drizzle":{"types":"./drizzle.d.ts","import":"./drizzle.js","default":"./drizzle.js"},"./package.json":"./package.json"},"_npmUser":{"name":"braedonsaunders","email":"bsaunders@rassaun.com"},"_resolved":"/tmp/a6e93fa5c15b6f29efeee995e6f04c59/braedonsaunders-appkit-notifications-2.0.0.tgz","_integrity":"sha512-o392OzAj3JHHKyk39cUsYbLtbpbKOCJ2CQP0yHRdDpqR01ucTES+E3rcCsAQGRZRQTX4zAbKuPUIKhTfrJlQDA==","repository":{"url":"git+https://github.com/braedonsaunders/appkit.git","type":"git","directory":"packages/notifications"},"_npmVersion":"10.9.8","description":"Production inbox, preferences, push enrollment, tenant routing cockpit, multi-channel runtime, and optional Drizzle adapters.","directories":{},"_nodeVersion":"22.23.2","_hasShrinkwrap":false,"peerDependencies":{"react":"^19.0.0","react-dom":"^19.0.0","drizzle-orm":"^0.45.2","lucide-react":"^1.24.0","@braedonsaunders/appkit-db":"^0.2.0","@braedonsaunders/appkit-ui":"^0.2.0","@braedonsaunders/appkit-jobs":"^0.2.1"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true},"drizzle-orm":{"optional":true},"lucide-react":{"optional":true},"@braedonsaunders/appkit-db":{"optional":true},"@braedonsaunders/appkit-ui":{"optional":true},"@braedonsaunders/appkit-jobs":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/appkit-notifications_2.0.0_1787095220892_0.17522510840294037","host":"s3://npm-registry-packages-npm-production"}},"3.0.0":{"name":"@braedonsaunders/appkit-notifications","version":"3.0.0","description":"Production inbox, preferences, push enrollment, tenant routing cockpit, multi-channel runtime, and optional Drizzle adapters.","license":"AGPL-3.0-or-later","type":"module","exports":{".":{"types":"./index.d.ts","import":"./index.js","default":"./index.js"},"./react":{"types":"./react.d.ts","import":"./react.js","default":"./react.js"},"./drizzle":{"types":"./drizzle.d.ts","import":"./drizzle.js","default":"./drizzle.js"},"./schema":{"types":"./schema.d.ts","import":"./schema.js","default":"./schema.js"},"./digest":{"types":"./digest.d.ts","import":"./digest.js","default":"./digest.js"},"./push":{"types":"./push.d.ts","import":"./push.js","default":"./push.js"},"./package.json":"./package.json"},"main":"./index.js","types":"./index.d.ts","peerDependencies":{"@braedonsaunders/appkit-db":"^0.2.0","@braedonsaunders/appkit-ui":"^0.3.0","@braedonsaunders/appkit-jobs":"^0.2.4","drizzle-orm":"^0.45.2","lucide-react":"^1.24.0","react":"^19.0.0","react-dom":"^19.0.0"},"peerDependenciesMeta":{"@braedonsaunders/appkit-db":{"optional":true},"@braedonsaunders/appkit-ui":{"optional":true},"@braedonsaunders/appkit-jobs":{"optional":true},"drizzle-orm":{"optional":true},"lucide-react":{"optional":true},"react":{"optional":true},"react-dom":{"optional":true}},"author":{"name":"Braedon Saunders"},"repository":{"type":"git","url":"git+https://github.com/braedonsaunders/appkit.git","directory":"packages/notifications"},"homepage":"https://github.com/braedonsaunders/appkit/tree/main/packages/notifications#readme","bugs":{"url":"https://github.com/braedonsaunders/appkit/issues"},"engines":{"node":">=22"},"keywords":["appkit","application-framework","typescript"],"_id":"@braedonsaunders/appkit-notifications@3.0.0","_integrity":"sha512-oBEBPKOdk/hpRrZTSsksv8q6cVPBaezYxnOA5Dfri6dzO45Z7O+WCC/HDjWWyiH6TVdm6CUP6fwF7munaH/y2w==","_resolved":"/tmp/9bde4d5cb478e817cd42e8c9da726c9b/braedonsaunders-appkit-notifications-3.0.0.tgz","_from":"file:braedonsaunders-appkit-notifications-3.0.0.tgz","_nodeVersion":"22.23.2","_npmVersion":"10.9.8","dist":{"integrity":"sha512-oBEBPKOdk/hpRrZTSsksv8q6cVPBaezYxnOA5Dfri6dzO45Z7O+WCC/HDjWWyiH6TVdm6CUP6fwF7munaH/y2w==","shasum":"6d3b3487606faafc59ee61310472a1fa6a4e16bd","tarball":"https://registry.npmjs.org/@braedonsaunders/appkit-notifications/-/appkit-notifications-3.0.0.tgz","fileCount":58,"unpackedSize":468225,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@braedonsaunders%2fappkit-notifications@3.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDuSBFKjC31iNwDXBArNnAmL3ZeOSKpqylGKWan0MyfhQIhAIsH3YjugJ63z7VQN13Bljgwbk5ttsR1f9jwUFaLJ14H"}]},"_npmUser":{"name":"braedonsaunders","email":"bsaunders@rassaun.com"},"directories":{},"maintainers":[{"name":"braedonsaunders","email":"bsaunders@rassaun.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/appkit-notifications_3.0.0_1789182586583_0.20287034521960012"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-18T23:20:20.721Z","modified":"2026-09-12T03:09:47.192Z","2.0.0":"2026-08-18T23:20:21.104Z","3.0.0":"2026-09-12T03:09:46.766Z"},"bugs":{"url":"https://github.com/braedonsaunders/appkit/issues"},"author":{"name":"Braedon Saunders"},"license":"AGPL-3.0-or-later","homepage":"https://github.com/braedonsaunders/appkit/tree/main/packages/notifications#readme","keywords":["appkit","application-framework","typescript"],"repository":{"type":"git","url":"git+https://github.com/braedonsaunders/appkit.git","directory":"packages/notifications"},"description":"Production inbox, preferences, push enrollment, tenant routing cockpit, multi-channel runtime, and optional Drizzle adapters.","maintainers":[{"name":"braedonsaunders","email":"bsaunders@rassaun.com"}],"readme":"# @braedonsaunders/appkit-notifications\n\nProduction notification infrastructure and user interfaces that applications\ncan adopt independently: multi-channel policy and dispatch at the root, the\ncomplete inbox and administration surfaces under `/react`, tenant-safe Drizzle\npersistence under `/drizzle`, digest scanning under `/digest`, and Web Push\nlifecycle under `/push`.\n\n## Install\n\n```bash\npnpm add @braedonsaunders/appkit-notifications\n```\n\nThe root has no runtime dependencies. Add React/UI, Drizzle/database, jobs, or\nWeb Push dependencies only when the corresponding entry point is used.\n\n## Production surfaces\n\n- `NotificationInbox` — the responsive three-pane inbox with smart folders,\n  category folders, search, to-dos, cursor paging, optimistic actions, reading\n  pane, mobile drawers, retry states, and loading skeleton.\n- `ProductionNotificationPreferences` — the complete category/channel matrix;\n  absent cells default enabled exactly like the production dispatcher and the\n  save adapter receives the complete bounded matrix.\n- `PushDeviceNotifications` — browser/OS capability detection, iOS Home Screen\n  guidance, permission, subscription persistence, test delivery, expiry-safe\n  disable behavior, and all production states.\n- `NotificationSettings` — tenant routing policy, transport readiness, digest\n  delivery, quiet hours, automatic scan cron/timezone, per-category enablement,\n  roles, people, groups, channels, escalation ladders, dirty state, and atomic\n  save boundary.\n\nApplications supply their real category catalogue, recipient catalogue,\nauthorized persistence adapters, transport configuration routes, credentials,\nand delivery providers. No application category or role vocabulary is bundled.\n\n## Persistence and jobs\n\n`@braedonsaunders/appkit-notifications/schema` owns notifications, preferences, subscriptions,\ntenant policy, and per-category settings. `@braedonsaunders/appkit-notifications/drizzle`\nprovides inbox, preferences, configuration, dispatch, and subscription stores\nbound to an application-owned RLS database handle.\n\nThe source-compatible BullMQ `NotifyJobData` and `PushJobData` contracts,\nvalidation, deterministic recipient batching, queue names, retry schedules, and\nretention settings live at `@braedonsaunders/appkit-jobs/notifications`.\n\n```ts\nimport { createJobs } from '@braedonsaunders/appkit-jobs'\nimport { createNotificationQueues } from '@braedonsaunders/appkit-jobs/notifications'\n\nconst queues = createNotificationQueues(createJobs({ redisUrl: process.env.REDIS_URL! }))\n\nawait queues.enqueueNotification({\n  tenantId,\n  userIds,\n  category: 'records',\n  type: 'record.updated',\n  title: 'Record updated',\n  linkPath: `/records/${recordId}`,\n})\n```\n\n## Application boundaries\n\nThe package owns the inbox, preference matrix, push enrollment, routing\ncockpit, schedule grammar, policy schema, notify/push queue profiles, digest\nbehavior, and Web Push handling. Framework routing, application categories,\ndomain recipient queries, credentials, and provider delivery remain typed host\nboundaries.\n","readmeFilename":"README.md"}