{"id":51448124,"url":"https://github.com/htmujahid/notifro","last_synced_at":"2026-07-05T18:30:22.475Z","repository":{"id":366671790,"uuid":"1273849626","full_name":"htmujahid/notifro","owner":"htmujahid","description":"Open-source, self-hostable notification infrastructure on Cloudflare, with a native MCP server for AI agents.","archived":false,"fork":false,"pushed_at":"2026-06-22T20:22:03.000Z","size":5737,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-22T22:04:00.028Z","etag":null,"topics":["auth","capacito","capacitor","cli","electron","mcp","react","react-router","sdk","shadcn","tanstack"],"latest_commit_sha":null,"homepage":"https://notifro.htmujahid.pages.dev","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/htmujahid.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-18T23:54:14.000Z","updated_at":"2026-06-22T20:22:35.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/htmujahid/notifro","commit_stats":null,"previous_names":["htmujahid/notifro"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/htmujahid/notifro","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/htmujahid%2Fnotifro","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/htmujahid%2Fnotifro/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/htmujahid%2Fnotifro/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/htmujahid%2Fnotifro/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/htmujahid","download_url":"https://codeload.github.com/htmujahid/notifro/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/htmujahid%2Fnotifro/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35165553,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-05T02:00:06.290Z","response_time":100,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":["auth","capacito","capacitor","cli","electron","mcp","react","react-router","sdk","shadcn","tanstack"],"created_at":"2026-07-05T18:30:19.517Z","updated_at":"2026-07-05T18:30:22.468Z","avatar_url":"https://github.com/htmujahid.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Notifro\n\n**Unified notification infrastructure: compose once, deliver everywhere.**\n\nNotifro normalizes ten channels behind a single compose-once API. Write a message once and\nNotifro transforms and delivers it across Slack, email, Microsoft Teams, Discord, WhatsApp,\nTelegram, web push, webhooks, in-app inbox, and SMS, with routing rules, fallback chains,\nprovider failover, scheduling, rate limiting, and a **native MCP server** so AI agents can send\nsafely. It runs entirely on Cloudflare's edge and is fully self-hostable.\n\n\u003ch1 align=\"center\"\u003e\n   \u003cpicture\u003e\n   \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"apps/site/public/bg-dark.png\"\u003e\n   \u003cimg alt=\"supasheet\" width=\"100%\" src=\"apps/site/public/bg-light.png\"\u003e\n   \u003c/picture\u003e\n\u003c/h1\u003e\n\n## Features\n\n- **Compose-once API**: one normalized payload, transformed per channel (Slack Block Kit,\n  HTML email, Teams adaptive cards, Discord embeds, web push, …). Content blocks plus a\n  template engine with variables, conditionals, loops, and i18n.\n- **10 channels**: Slack, email (SMTP/SendGrid/Resend), Teams, Discord, WhatsApp, Telegram,\n  web push (VAPID), webhooks (HMAC-signed), SMS (Twilio), and an in-app inbox.\n- **Routing \u0026 fallback**: priority-ordered routing rules, ordered fallback chains, and\n  per-channel provider failover, with dry-run route resolution.\n- **Scheduling**: send-at with timezone awareness, recurring (cron) sends, quiet hours,\n  delivery windows, and per-channel rate limiting, driven by a cron-trigger sweep.\n- **Reliability**: a Cloudflare Queue with exponential-backoff retries, a dead-letter queue,\n  idempotency keys, PII redaction, delivery events (delivered/opened/clicked/bounced), open \u0026\n  click tracking, and inbound provider receipts.\n- **Templates \u0026 content**: template editor, version history with restore, and a brand kit.\n- **Analytics**: delivery stats by channel, status, and date; top topics; and an overview\n  dashboard, backed by a full API request log.\n- **Auth \u0026 keys**: better-auth with email + password, email OTP, Google OAuth, 2FA\n  (TOTP / email OTP / backup codes), phone verification (Twilio), and scoped `rk_` API keys.\n- **Native MCP server**: agents send, schedule, preview, template, and query analytics within\n  granted scopes, behind approval gates and rate limits.\n\n## MCP server\n\nNotifro exposes the platform at `POST /mcp` (authenticated with an `rk_` API key), available\nhosted (Streamable HTTP) and local (stdio via `@notifro/mcp`).\n\n- **Tools**: `send_notification`, `schedule_notification`, `list_channels`,\n  `get_delivery_status`, `create_template`, `render_preview`, `query_analytics`, `approve_action`.\n- **Resources**: `notifro://channels`, `notifro://templates`, `notifro://recent-deliveries`.\n- **Safety**: per-tool approval gates, key-scoped access, KV rate limiting, idempotency, and\n  every call written to the request log.\n\n## Tech stack\n\nCloudflare Workers · Hono · React 19 · better-auth · Kysely · D1 · Queues · KV · Cloudflare\nEmail · `@hono/zod-openapi` + Scalar. Tooling: pnpm workspaces + Turborepo.\n\n## Monorepo layout\n\n```\napps/\n  api       → Cloudflare Worker: all backend logic (compose, queue, cron, MCP, auth)\n  web       → React 19 SPA dashboard\n  site      → Astro marketing site\n  desktop   → Electron (Forge) wrapper\n  ios       → Capacitor iOS wrapper\n  android   → Capacitor Android wrapper\npackages/\n  core         → feature-level UI components \u0026 TanStack Query hooks\n  views        → page components \u0026 platform routers\n  app          → cross-platform auth + app context\n  api-client   → typed HTTP client\n  sdk          → public TypeScript SDK\n  cli          → `notifro` CLI\n  mcp          → MCP server package\n  mailer       → transactional email templates\n  templating   → Mustache-style template engine\n  ui           → shadcn UI primitives\n  ui-primitives→ theme provider\n  i18n         → internationalisation stubs\n```\n\n## Development\n\n```bash\npnpm install\npnpm --filter api db:migrate   # apply migrations to a local D1\npnpm dev                       # turbo dev: api (:8787) + web (:5173) + site (:4321)\npnpm build                     # turbo build\npnpm lint\npnpm typecheck\n```\n\n## Self-hosting\n\nNotifro deploys to your own Cloudflare account: a D1 database, two KV namespaces, a delivery\nqueue + dead-letter queue, the Email send binding, and an every-minute cron trigger. In short:\n\n```bash\ncd apps/api\nnpx wrangler d1 create notifro\nnpx wrangler kv namespace create notifro-auth\nnpx wrangler kv namespace create notifro-rate-limit\nnpx wrangler queues create delivery-queue\nnpx wrangler queues create delivery-dlq\n# paste the ids into apps/api/wrangler.jsonc, then set secrets:\nnpx wrangler secret put CONNECTION_ENC_KEY   # + FRONTEND_URL, GOOGLE_*, TWILIO_*, VAPID_PUBLIC_KEY\npnpm --filter api db:migrate:remote\npnpm --filter api deploy\n```\n\nPoint the web app at your API (`VITE_API_URL`) and deploy `apps/web` (and optionally `apps/site`)\nto Cloudflare Pages. The full walkthrough lives on the marketing site's **Self-host** page.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhtmujahid%2Fnotifro","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhtmujahid%2Fnotifro","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhtmujahid%2Fnotifro/lists"}