Use cases

How teams put pushr to work.

Eight teams, one HTTP request. Watch revenue, ship safely, page the right person, keep AI agents and their bills in check, and hand people the calls AI shouldn’t make.

Every demo runs in your browser. Nothing leaves the page.

Wednesday, September 30
9:41
Tap one to see how it’s built.
01 / 08CommerceNorthwind, an online store

Hear about the orders that matter. Sleep through the rest.

✕Before

Order emails pile up until nobody reads them, so the $1,240 wholesale order looks the same as a $38 one, and a failed payment waits until morning.

With pushr
  • Small orders land quietly in Notification Center and never light up the screen.
  • Big orders break through Focus, so they’re seen within minutes.
  • The whole team shares one feed, each person with their own quiet hours.
Try it: a day of orders
The owner’s phone
FocusWednesday, September 30
9:41
Send an order from the store.
The store sends

Each order becomes one request, at the priority it deserves.

Revenue today$0

The rule lives in your code, so it can be anything: an amount, a customer tier, a product. Your team sees the same feed, each with their own Focus and quiet hours.

ts
import { notify } from '@pushrsh/sdk';

// In your order webhook
const big = order.total >= 1000;

await notify({
  title: big ? 'Big order' : 'New order',
  body: `${order.number} · ${usd(order.total)}`,
  priority: big ? 'high' : 'low',
  url: order.adminUrl,
});
02 / 08EngineeringAcme, a SaaS team

Watch the deploy, then ship it from your phone.

✕Before

Production deploys need a human to say yes, so someone sits watching CI, or the approval waits in a browser tab until they’re back at a laptop.

With pushr
  • Build and test progress stays on the Lock Screen and in the Dynamic Island.
  • The pipeline stops before production and asks. One tap answers it.
  • Only one answer counts, even if two people tap at once.
Try it: ship with a tap
Your phone
Wednesday, September 30
9:41
Merge the pull request to start a deploy.
The pipeline
  1. Build
  2. Tests
  3. Approval
  4. Deploy

Merge to watch the requests go back and forth.

ts
import { liveActivity, notify } from '@pushrsh/sdk';

const deploy = liveActivity(`deploy-${pr}`, { name: 'ci.acme' });
await deploy.start({ title: `Deploy #${pr}`, status: 'Building' });
await deploy.update({ status: 'Running tests', progress: 0.5 });

await notify({
  title: `Ship #${pr} to production?`,
  body: '4 commits · 214 tests passed',
  actions: [
    { kind: 'callback', id: 'approve', label: 'Approve',
      callbackUrl: approveUrl },
    { kind: 'callback', id: 'reject', label: 'Reject',
      callbackUrl: rejectUrl, destructive: true },
  ],
});
03 / 08OperationsBeacon, a two-person API business

Page one person, not the whole team.

✕Before

When the API goes down at 2 am, alerts in a shared channel either wake everyone or nobody, and the customers find out first.

With pushr
  • Two failed checks in a row confirm it’s down, so one blip doesn’t page anyone.
  • The person on call is paged until they answer. If they don’t, the next person is.
  • The public status page shows the outage, and the recovery tells everyone it’s over.
Try it: an outage at 2 am
Maya’s phone
FocusWednesday, September 30
9:41
Quiet. Nothing is wrong.
The team
  • MayaAsleep
    On call this week
  • SamAsleep
    Next on the rotation
status.pushr.sh/beaconOperational

Break the API to start the night.

ts
import { uptime } from '@pushrsh/sdk';

// Safe to run on every deploy.
await uptime('api', {
  url: 'https://api.beacon.dev/health',
  every: '1m',
  confirmAfter: 2,
});

// Who's on call is set in the app:
// Beacon → On-call → Maya, then Sam.
04 / 08DataAtlas Data, a reporting company

Find out when the nightly job didn’t run.

✕Before

A cron job that crashes sends an error. One that never starts sends nothing, and the first sign is a customer’s dashboard with yesterday’s numbers.

With pushr
  • Good nights send nothing at all.
  • A failure, or a night the job never ran, sends one alert by 4 am.
  • The next good run replaces the alert, so the feed shows exactly how long it was down.
Try it: a week of nightly jobs
The data team’s phone
Wednesday, September 30
9:41
Run the week. Good nights send nothing.
This week · tap a night to change it
✓ Runs✕ Fails– Never runs

The job pings pushr when it finishes. pushr notices when it doesn’t.

Pushes this week: 0
bash
# crontab: export at 03:00, check in when it's done
0 3 * * * ./export.sh && curl -fsS \
  -H "Authorization: Bearer $PUSHR_TOKEN" \
  "$PUSHR_URL/heartbeat/nightly-export?every=1d&grace=1h"

# Or report the failure, with the reason
./export.sh || curl -fsS -X POST --data "$(tail -1 export.log)" \
  -H "Authorization: Bearer $PUSHR_TOKEN" \
  "$PUSHR_URL/heartbeat/nightly-export/fail"
05 / 08AI agentsAny team using Claude, ChatGPT or Cursor

Let agents work alone, and ask before they act.

✕Before

An agent that can change production either needs someone watching the whole time, or is trusted with steps that can’t be undone.

With pushr
  • The agent asks on your phone before anything risky, and waits for your answer.
  • Approve, reject, or reply with what to do instead.
  • It tells you when it’s finished, so nobody has to keep checking.
Try it: an agent that asks first
Your phone
Wednesday, September 30
9:41
Start the agent. It asks before anything risky.
The agent’s session

The agent works on its own, and checks with you when it matters.

bash
# Claude Code
claude mcp add --transport http pushr https://pushr.sh/mcp

# Then tell your agent, or put it in CLAUDE.md / AGENTS.md:
# "Before anything you can't undo, ask me with pushr
#  and wait for my answer. Notify me when you're done."
06 / 08PlatformLumen AI, a product built on models

Catch the runaway agent before it spends the month.

✕Before

Model bills now move faster than anyone reviews them. One retry loop or a prompt that suddenly needs 10× the tokens, and the overnight spend is already gone by the time the invoice email arrives.

With pushr
  • Normal days send nothing. An unusual spend rate sends one push within minutes.
  • Pause the agent from the notification. Your gateway gets the answer.
  • At the daily budget, new runs wait until someone raises it or pauses everything.
Try it: a runaway agent
The platform lead’s phone
Wednesday, September 30
9:41
Run the day. Normal spend sends nothing.
Model spend today
00:00 · $0 of $500
00:0006:0012:0018:0024:00

Your gateway pushes on what’s unusual, not on every call.

ts
import { notify } from '@pushrsh/sdk';

// In your LLM gateway, after each call
if (rate > baseline * 5 && !alerted.has(agent)) {
  alerted.add(agent);
  await notify({
    title: `AI spend is ${Math.round(rate / baseline)}× normal`,
    body: `${agent} · ${usd(rate)}/h`,
    priority: 'high',
    replaceKey: 'ai-spend',
    actions: [
      { kind: 'callback', id: 'pause', label: 'Pause agent',
        callbackUrl: `${GATEWAY}/agents/${agent}/pause?key=${KEY}` },
      { kind: 'callback', id: 'ignore', label: 'Let it run',
        callbackUrl: `${GATEWAY}/agents/${agent}/ignore?key=${KEY}` },
    ],
  });
}
07 / 08SupportTidepool, a payments app

AI answers most tickets. A person decides the rest.

✕Before

An AI assistant can answer “where is my card?” all day, but a $480 refund for an angry customer shouldn’t be its call, and a handoff queue nobody watches leaves that customer waiting for hours.

With pushr
  • Routine tickets are solved without anyone being notified.
  • Anything over the assistant’s limit reaches a person in seconds, with Refund and Decline on it.
  • Answer the customer from the notification. The reply goes straight to their chat.
Try it: the one ticket AI shouldn’t decide
The support lead’s phone
Wednesday, September 30
9:41
Open the inbox. Routine tickets never reach you.
Support inbox
Answered by AI: 0 · Needed a person: 0
  • Six customers are about to write in.
Dana’s chat
    ts
    // Your assistant's handoff, when a refund is over its limit
    await notify({
      title: 'Refund over the AI’s limit',
      body: `${customer.name} · ${usd(amount)} · ${reason}`,
      priority: 'high',
      url: ticket.url,
      actions: [
        { kind: 'callback', id: 'refund', label: 'Refund',
          callbackUrl: `${API}/tickets/${ticket.id}/refund?key=${KEY}` },
        { kind: 'callback', id: 'decline', label: 'Decline', destructive: true,
          callbackUrl: `${API}/tickets/${ticket.id}/decline?key=${KEY}` },
        { kind: 'reply', id: 'answer', label: `Answer ${customer.first}`,
          callbackUrl: `${API}/tickets/${ticket.id}/reply?key=${KEY}` },
      ],
    });
    08 / 08FacilitiesHarbor Kitchen, a restaurant group

    A warm freezer wakes someone up. A blip doesn’t.

    ✕Before

    Cheap wireless sensors are everywhere now, and they all send email. A freezer door left open at closing can cost thousands in stock by morning, while a phone on silent sleeps through it.

    With pushr
    • Opening the door to restock never alerts. Five minutes above the limit does.
    • A critical alert rings through silent mode, and keeps ringing until someone answers.
    • Back to temperature, the recovery replaces the alert with how long it was warm.
    Try it: a freezer at 3 am
    The manager’s phone · on silent
    Wednesday, September 30
    9:41
    Asleep, phone on silent.
    Walk-in freezer 2
    -18.0°CAlerts above -10°C
    for 5 minutes
    -25°C5°C

    Drag the temperature, or leave the door open.

    python
    # Runs on every reading from the sensor hub
    if warm_for_minutes(sensor) >= 5:
        requests.post(f"{PUSHR_URL}/notify",
            headers={"Authorization": f"Bearer {PUSHR_TOKEN}"},
            json={
                "title": "Walk-in freezer 2 is warming",
                "body": f"{temp:.1f}°C · door sensor: {door}",
                "priority": "high",
                "critical": True,
                "ack": {"timeoutSec": 120, "maxAttempts": 5},
                "replaceKey": "freezer-2",
            })

    The same pieces, whatever your team runs.

    One request to start

    A POST from any language, script or webhook. No SDK required, nothing to install on your servers.

    Shared with your team

    Owners, editors and viewers per app. Viewers see everything but can’t approve.

    Alerting built in

    Uptime checks, heartbeats, on-call and status pages without another tool to pay for.

    Runs on your servers too

    The backend is open source. Self-host it when your data has to stay with you.

    Wire it up tonight.

    Free to start. 1,000 pushes a month and one source app are on us.

    Coming soon to the App Store

    iPhone app

    Feed, Live Activities, widgets and per-app sounds.

    Coming sooniOS 16.2+

    CLI

    Send from the shell, pipe stdin, drive Live Activities.

    $brew install cpreston321/tap/pushrsh

    SDK

    Typed notify() and liveActivity() for any fetch runtime.

    $bun add @pushrsh/sdk