v0.7.2 · the dev-native pubsub layer

Push notifications
with one curl.

A pubsub layer for humans. Pipe anything into a topic from your shell, CI, cron, or a webhook — get it on your phone, terminal, slack, or email. No SDK. No account to start.

TRY IT NOW · NO ACCOUNT NEEDED

$ curl -d "hi from the marketing site" emitsignal.com/me-tryout

✓ delivered · open this URL on your phone to read it → emitsignal.com/r/me-tryout

emitsignal listen — 8 channels · livesse · connected
$ emitsignal listen --priority >=2 --format pretty
21:52:01deploy/prodp4Deploy succeeded · api-gateway → v2.14.3
21:52:14alerts/prodp5High memory on api-02 — mem.used > 92%
21:52:22ci/webp3Build passed · feat/oauth-pkce (247 tests)
21:53:44github/acmep2PR #482 reviewed by maya — approved
21:55:02cron/backupp3nightly-backup.sh ✓ (14.2 GB → s3)
21:58:11errors/webp5TypeError spike · 34 events in 2m
22:00:00stripe/paymentsp3webhook · invoice.paid · $4,820.00
22:01:18ci/apip3Build passed · main · 312 tests · 41s
22:02:44home/sensorsp2Garage door open for 12m
22:03:09github/acmep2New issue · #1284 · "auth flow stuck"
22:04:00deploy/prodp4Canary rollout · 10% traffic shifted
22:05:32alerts/prodp5TLS cert expiring · cdn.acme.io · 7d
21:52:01deploy/prodp4Deploy succeeded · api-gateway → v2.14.3
21:52:14alerts/prodp5High memory on api-02 — mem.used > 92%
21:52:22ci/webp3Build passed · feat/oauth-pkce (247 tests)
21:53:44github/acmep2PR #482 reviewed by maya — approved
21:55:02cron/backupp3nightly-backup.sh ✓ (14.2 GB → s3)
21:58:11errors/webp5TypeError spike · 34 events in 2m
22:00:00stripe/paymentsp3webhook · invoice.paid · $4,820.00
22:01:18ci/apip3Build passed · main · 312 tests · 41s
22:02:44home/sensorsp2Garage door open for 12m
22:03:09github/acmep2New issue · #1284 · "auth flow stuck"
22:04:00deploy/prodp4Canary rollout · 10% traffic shifted
22:05:32alerts/prodp5TLS cert expiring · cdn.acme.io · 7d
$

USED BY 2,400+ DEV TEAMS · PUBLISHING 90M+ SIGNALS / MONTH

vercellinearplanetscalesupabaserailwayfly.iotursocal.com
HOW IT WORKS

One verb. Three steps. Zero SDKs.

Topics are strings. Subscriptions are URLs. Routing is plain English (well — plain expressions). That's the entire mental model.

01

Publish from anywhere.

Curl, the CLI, a webhook, GitHub Actions, a python script, or a one-line shell pipe. If it can hit an HTTP endpoint, it can publish.

# from a shell
$ echo "v2.14.3 shipped" | emitsignal publish deploy/prod -p4

# from CI (one line)
$ curl emitsignal.com/ci/web -d "build #4821 passed"

# from anywhere
$ pg_dump prod | gzip > /tmp/bak.gz && \
    emitsignal publish cron/backup "$(date) ✓"

02

Route with filters.

Per-channel rules: priority, tags, regex, deliver-window. Everything is a topic; topics are free-form strings; rules cascade.

# routing for alerts/prod
priority:5            → push + sms + slack #oncall
priority:4            → push + slack #alerts
priority:<=3          → inbox only
tag:sev2              → page on-call rotation
tag:resolved          → silence
hour:between(0,7)     → batch · digest at 08:00

03

Deliver wherever you read.

Phone, terminal, web inbox, slack, email, webhook, RSS. Read once syncs everywhere. End-to-end in <300ms p99.

# read from your terminal
$ emitsignal listen alerts/prod

# read in a TUI
$ emitsignal tui

# read in a script
$ emitsignal listen --format json | jq -r .title

# read on your phone, web, slack — automatic
SURFACES

Read & write from wherever you already work.

Same brand, same routing, every surface. Pick one or use all five — they sync.

CLI · emitsignal

Listen, publish, tui.

$ wsp listen 'priority>=4 AND tag:prod'
→ connected · 4 channels match · ws
21:52:14 alerts/prod p5 High memory on api-02
21:52:01 deploy/prod p4 v2.14.3 shipped
21:48:02 cron/backup p3 ✓ 14.2 GB → s3
$
Mobile · iOS/Android

Inbox · push · priorities.

alerts/prod2m
High memory on api-02
mem.used > 92%
deploy/prod4m
v2.14.3 shipped
api-gateway · 1m 42s
ci/web12m
Build passed
247 tests green
Web · dashboard

Inbox, channels, routing.

EmitSignal7 unread
● Inbox
● Channels
● Publish
● Keys
alerts/prodp5 event
alerts/prodp4 event
alerts/prodp3 event
alerts/prodp2 event
USE CASES

Anything that emits a status line.

People ship deploys with us. They watch their freezer. They get paged at 4am when the API forgets how to count. Topics are strings — go wild.

alerts/prodp5

On-call paging without PagerDuty.

priority:5 → sms + push + slack
deploy/prodp4

Deploys announced everywhere.

CI → emitsignal publish deploy/prod
cron/backupp3

Cron jobs that tell you they’re alive.

emitsignal run "pg_dump | gzip > /tmp"
errors/webp5

Sentry-grade firehose, your routing.

tag:new AND p>=4 → page
me/personalp2

A pager for your own life.

echo "$THING" | emitsignal publish me
github/repop2

Filter the noise out of GitHub.

event:review_requested → push
PRICING

Pay for what you push.

No per-seat tax on read-only viewers. No SDK to license. The free tier is real — many teams stay on it.

Free

$0forever, for hobby use

For your own pager, side-projects, and trying it out.

  • 10,000 signals / month
  • 5 channels
  • 1 user
  • Push + email + RSS
  • Community support
Start free
most popular

Team

$24/ user / month

For teams that ship code and want to know about it.

  • 1M signals / month / user
  • Unlimited channels
  • SSO · SAML · SCIM
  • SMS + Slack + Webhooks
  • Routing rules · regex filters
  • Audit log · 90d retention
Start 14-day trial

Enterprise

Customvolume + on-prem

For when 4am paging needs to be on contract.

  • Unlimited signals
  • Self-hosted available
  • Dedicated cluster
  • On-call rotation tooling
  • 99.99% SLA
  • Custom retention · BYOK
Talk to sales
A signal = one published message. Receiving is free — same signal to 200 subscribers still counts as 1.see fair-use →

One pipe. Everywhere you read.

Free to start. No credit card. No SDK. Thirty seconds from brew install to your first signal.