[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-75433":3},{"id":4,"name":5,"fullName":6,"owner":5,"repo":5,"description":7,"homepage":8,"htmlUrl":9,"language":10,"languages":9,"totalLinesOfCode":9,"stars":11,"forks":12,"watchers":13,"openIssues":14,"contributorsCount":15,"subscribersCount":15,"size":15,"stars1d":16,"stars7d":17,"stars30d":18,"stars90d":15,"forks30d":15,"starsTrendScore":14,"compositeScore":19,"rankGlobal":9,"rankLanguage":9,"license":20,"archived":21,"fork":21,"defaultBranch":22,"hasWiki":21,"hasPages":21,"topics":23,"createdAt":9,"pushedAt":9,"updatedAt":32,"readmeContent":33,"aiSummary":34,"trendingCount":15,"starSnapshotCount":15,"syncStatus":35,"lastSyncTime":36,"discoverSource":37},75433,"better-notify","better-notify\u002Fbetter-notify","All your notifications from one library. For Node.js and Bun.","https:\u002F\u002Fbetter-notify.com",null,"TypeScript",272,5,142,3,0,1,4,131,56.33,"MIT License",false,"main",[5,24,25,26,27,28,29,30,31],"cloudflare","nodejs","notifications","notify","orpc","resend","trpc","typescript","2026-06-12 04:01:18","\u003Cp align=\"center\">\n  \u003Cpicture>\n    \u003Csource media=\"(prefers-color-scheme: dark)\" srcset=\"libs\u002Fui\u002Fsrc\u002Fassets\u002Flogo-stacked-white.svg\">\n    \u003Csource media=\"(prefers-color-scheme: light)\" srcset=\"libs\u002Fui\u002Fsrc\u002Fassets\u002Flogo-stacked.svg\">\n    \u003Cimg alt=\"Better-Notify\" src=\"libs\u002Fui\u002Fsrc\u002Fassets\u002Flogo-stacked.svg\" width=\"268\">\n  \u003C\u002Fpicture>\n\u003C\u002Fp>\n\n\u003Cp align=\"center\">End-to-end typed notification infrastructure for Node.js and Bun.\u003C\u002Fp>\n\n\u003Cp align=\"center\">\n  \u003Ca href=\"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@betternotify\u002Fcore\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fnpm\u002Fv\u002F@betternotify\u002Fcore?label=npm&color=3a5a8c\" alt=\"npm version\">\u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fbetter-notify\u002Fbetter-notify\u002Fblob\u002Fmain\u002FLICENSE\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Flicense\u002Fbetter-notify\u002Fbetter-notify?color=3a5a8c\" alt=\"license\">\u003C\u002Fa>\n  \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fnode\u002Fv\u002F@betternotify\u002Fcore?color=3a5a8c\" alt=\"node version\">\n\u003C\u002Fp>\n\n\u003Cp align=\"center\">\n  \u003Ca href=\"https:\u002F\u002Fbetter-notify.com\">Website\u003C\u002Fa> ·\n  \u003Ca href=\"https:\u002F\u002Fbetter-notify.com\u002Fdocs\">Docs\u003C\u002Fa> ·\n  \u003Ca href=\"https:\u002F\u002Fbetter-notify.com\u002Fblog\">Blog\u003C\u002Fa> ·\n  \u003Ca href=\"https:\u002F\u002Fbetter-notify.com\u002Fdocs\u002Fchangelog\">Changelog\u003C\u002Fa>\n\u003C\u002Fp>\n\n\u003Cbr>\n\n## Why Better-Notify?\n\n- **Typed end-to-end** — one catalog type drives the client, queue worker, and webhook router. Schema and template can't silently drift.\n- **Multi-channel** — email, SMS, push, Slack, Discord, Telegram, and more from the same pipeline. Define once, send anywhere.\n- **Zero lock-in** — swap transports (SMTP, Resend, Mailchimp, Cloudflare Email) without touching business logic. Standard Schema means no hard Zod dependency either.\n- **Batteries included** — middleware (rate-limit, idempotency, tracing, dry-run), hooks, plugins, and a logger built into core.\n\n## Quick start\n\n```sh\nnpm install @betternotify\u002Fcore @betternotify\u002Femail zod\n```\n\n```ts\nimport { createNotify, createClient } from '@betternotify\u002Fcore';\nimport { emailChannel, mockTransport } from '@betternotify\u002Femail';\nimport { z } from 'zod';\n\nconst email = emailChannel({ defaults: { from: 'hello@example.com' } });\nconst rpc = createNotify({ channels: { email } });\n\nconst catalog = rpc.catalog({\n  welcome: rpc\n    .email()\n    .input(z.object({ name: z.string() }))\n    .subject(({ input }) => `Welcome, ${input.name}`)\n    .template({ render: async ({ input }) => ({ html: `\u003Ch1>Hi ${input.name}\u003C\u002Fh1>` }) }),\n});\n\nconst mail = createClient({\n  catalog,\n  transportsByChannel: { email: mockTransport() },\n});\n\nawait mail.welcome.send({ to: 'john@example.com', input: { name: 'John' } });\n```\n\n## Packages\n\n| Channel                                                                          | Transport                                                                                        | Template                                                                               |\n| -------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------- |\n| [`@betternotify\u002Femail`](https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@betternotify\u002Femail)       | [`@betternotify\u002Fsmtp`](https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@betternotify\u002Fsmtp)                         | [`@betternotify\u002Freact-email`](https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@betternotify\u002Freact-email) |\n| [`@betternotify\u002Fsms`](https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@betternotify\u002Fsms)           | [`@betternotify\u002Fresend`](https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@betternotify\u002Fresend)                     | [`@betternotify\u002Fmjml`](https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@betternotify\u002Fmjml)               |\n| [`@betternotify\u002Fpush`](https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@betternotify\u002Fpush)         | [`@betternotify\u002Fmailchimp`](https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@betternotify\u002Fmailchimp)               | [`@betternotify\u002Fhandlebars`](https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@betternotify\u002Fhandlebars)   |\n| [`@betternotify\u002Fwebpush`](https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@betternotify\u002Fwebpush)   | [`@betternotify\u002Fcloudflare-email`](https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@betternotify\u002Fcloudflare-email) |                                                                                        |\n| [`@betternotify\u002Fslack`](https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@betternotify\u002Fslack)       | [`@betternotify\u002Ftwilio`](https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@betternotify\u002Ftwilio)                     |                                                                                        |\n| [`@betternotify\u002Fdiscord`](https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@betternotify\u002Fdiscord)   | [`@betternotify\u002Fautosend`](https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@betternotify\u002Fautosend)                 |                                                                                        |\n| [`@betternotify\u002Ftelegram`](https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@betternotify\u002Ftelegram) | [`@betternotify\u002Fonesignal`](https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@betternotify\u002Fonesignal)               |                                                                                        |\n| [`@betternotify\u002Fwhatsapp`](https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@betternotify\u002Fwhatsapp) | [`@betternotify\u002Fselligent`](https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@betternotify\u002Fselligent)               |                                                                                        |\n| [`@betternotify\u002Fgithub`](https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@betternotify\u002Fgithub)     |                                                                                                  |                                                                                        |\n| [`@betternotify\u002Fzapier`](https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@betternotify\u002Fzapier)     |                                                                                                  |                                                                                        |\n\nCore: [`@betternotify\u002Fcore`](https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@betternotify\u002Fcore) · Integrations: [`@betternotify\u002Fmcp`](https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@betternotify\u002Fmcp)\n\nScaffolding: [`create-better-notify`](https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fcreate-better-notify)\n\n```sh\nnpx create-better-notify@latest\n```\n\n---\n\n## Star History\n\n\u003Ca href=\"https:\u002F\u002Fwww.star-history.com\u002F?repos=better-notify%2Fbetter-notify&type=date&legend=top-left\">\n \u003Cpicture>\n   \u003Csource media=\"(prefers-color-scheme: dark)\" srcset=\"https:\u002F\u002Fapi.star-history.com\u002Fchart?repos=better-notify\u002Fbetter-notify&type=date&theme=dark&legend=top-left\" \u002F>\n   \u003Csource media=\"(prefers-color-scheme: light)\" srcset=\"https:\u002F\u002Fapi.star-history.com\u002Fchart?repos=better-notify\u002Fbetter-notify&type=date&legend=top-left\" \u002F>\n   \u003Cimg alt=\"Star History Chart\" src=\"https:\u002F\u002Fapi.star-history.com\u002Fchart?repos=better-notify\u002Fbetter-notify&type=date&legend=top-left\" \u002F>\n \u003C\u002Fpicture>\n\u003C\u002Fa>\n\n---\n\n\u003Cp align=\"center\">\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fbetter-notify\u002Fbetter-notify\">GitHub\u003C\u002Fa> ·\n  \u003Ca href=\"https:\u002F\u002Fx.com\u002Fbetter_notify\">X\u003C\u002Fa>\n\u003C\u002Fp>\n\n\u003Cp align=\"center\">Created by \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fthereis\">Lucas Reis\u003C\u002Fa> · \u003Ca href=\"https:\u002F\u002Fx.com\u002Flucasreis\">X\u003C\u002Fa>\u003C\u002Fp>\n\n\u003Cp align=\"center\">MIT License\u003C\u002Fp>\n","better-notify 是一个为 Node.js 和 Bun 设计的全类型通知基础设施库。其核心功能包括端到端的类型安全，确保客户端、队列工作器和 Webhook 路由器的一致性；支持多渠道发送（如邮件、短信、推送等），只需定义一次即可在不同平台发送；无供应商锁定，可轻松更换传输方式（如 SMTP、Resend、Mailchimp 等）而无需修改业务逻辑；此外，它还内置了丰富的中间件（限流、幂等性、追踪、模拟运行）、钩子、插件及日志记录功能。适用于需要统一管理多种通知服务的应用场景，尤其是那些对代码质量和灵活性有较高要求的项目。",2,"2026-06-11 03:52:44","CREATED_QUERY"]