A tiny push notification app to get alerts on anything.
pingrb turns webhook events into clean push notifications. Stripe paid, deploy failed, agent finished. Anything that can POST lands as a push on your phone.
Live at pingrb.com. iOS app on the App Store. Android coming soon.
Built with Ruby Native. One Rails app, both platforms, no Xcode.
Each source has its own webhook URL or CLI token. Parsers are self-describing: WebhooksController doesn't case-switch on parser type, each parser handles its own auth and parsing.
- Stripe (HMAC): payments, subscriptions, refunds, disputes
- Cal.com (HMAC): bookings, reschedules, cancellations
- GitHub (HMAC): opened issues, new comments, failed workflow runs
- Hatchbox (token-in-URL): failed deploys
- StatusCake (token-in-URL): site down, recovered
- Custom (token-in-URL): any
{title, body, url}JSON payload - CLI (token-in-URL): a Go binary (
brew install ruby-native/tap/pingrb) for agents and scripts
- Sign up.
- Add a source.
- Paste the webhook URL into the source's destination, or install the CLI.
- Get pinged on every event, parsed into a one-liner.
- Rails 8.1 on Ruby 4.0
- SQLite (multi-database: primary, cache, queue, cable)
- Solid Queue / Solid Cache / Solid Cable
- Hotwire (Turbo + Stimulus) with morph-refresh broadcasts
- Tailwind CSS v4 (IBM Plex Mono throughout)
- iOS and Android apps via Ruby Native (
ruby_nativegem) - Push delivery via
action_push_nativeto APNs and FCM - Postmark for mail
bin/setup # bundle install + db setup + seed
bin/dev # Tailwind watcher + Rails server on :3010
bin/rails testThe dev seed creates a user@example.com / password account with sources and notifications. The sign-in form auto-fills these in development.
For real webhook testing, the named Cloudflare tunnel at pingrb.rubynative.com points to localhost:3010. The public_webhook_url helper reads tmp/public_host so source pages display the public URL to paste into Stripe, Cal.com, etc.
See CLAUDE.md for the full pattern. Short version:
app/parsers/<name>_parser.rbinheriting fromParser- Add to
Source::PARSER_TYPESand (usually)Source::CREATABLE_PARSER_TYPES - Setup and test partials at
app/views/sources/_setup_<name>.html.erband_test_<name>.html.erb - Tests at
test/parsers/<name>_parser_test.rb - Seed fixtures at
db/seeds/webhooks/<name>/*.{json,txt}
Hatchbox auto-deploys main on push. Solid Queue must run inside Puma in production, gated on SOLID_QUEUE_IN_PUMA=true. Without that env var, push delivery jobs enqueue but never execute.
The iOS app builds via bundle exec ruby_native deploy. The build pulls the latest v* tag from ruby-native/native, so iOS-side changes require tagging a release on the native repo.
Private.