Send Push Notifications and Trigger Live Activities with Ruby

Use the official Ruby SDK to deliver immediate Push Notifications and Live Activity progress updates for long-running jobs and automation workflows.

Install

gem install activitysmith

Setup

require "activitysmith"
activitysmith = ActivitySmith::Client.new(
api_key: ENV.fetch("ACTIVITYSMITH_API_KEY")
)

Push Notifications

Send an immediate notification for a completed task or event:

Push notification example for a new subscription event
activitysmith.notifications.send(
{
title: "New subscription 💸",
message: "Customer upgraded to Pro plan"
}
)

Send images, videos, or audio with your push notifications, press and hold to preview media directly from the notification, then tap through to open the linked content.

Image Preview

Rich push notification with image
activitysmith.notifications.send(
{
title: "Homepage ready",
message: "Your agent finished the redesign.",
media: "https://cdn.example.com/output/homepage-v2.png",
redirection: "https://github.com/acme/web/pull/482"
}
)

Audio Preview

Rich push notification with audio

What will work

  • direct image URL: .jpg, .png, .gif, etc.
  • direct audio file URL: .mp3, .m4a, etc.
  • direct video file URL: .mp4, .mov, etc.
  • URL that responds with a proper media Content-Type, even if the path has no extension

media can be combined with redirection, but not with actions.

Push notification redirection and actions are optional and can be used to redirect the user to a specific URL when they tap the notification or to trigger a specific action when they long-press the notification. Webhooks are executed by ActivitySmith backend.

Actionable push notification with redirection and actions
activitysmith.notifications.send(
{
title: "New subscription 💸",
message: "Customer upgraded to Pro plan",
redirection: "https://crm.example.com/customers/cus_9f3a1d",
actions: [
{
title: "Open CRM Profile",
type: "open_url",
url: "https://crm.example.com/customers/cus_9f3a1d"
},
{
title: "Start Onboarding Workflow",
type: "webhook",
url: "https://hooks.example.com/activitysmith/onboarding/start",
method: "POST",
body: {
customer_id: "cus_9f3a1d",
plan: "pro"
}
}
]
}
)

Live Activities

Choose the Live Activity type that matches what you want to show:

Stats Live Activity with six labeled sales metrics

Stats

Show up to 8 labeled values on your Lock Screen, from revenue and orders to uptime and conversion.

Metrics Live Activity with CPU and memory values

Metrics

Track two related values with segmented bars, such as CPU and memory.

Segmented Progress Live Activity showing a workflow step

Segmented Progress

Show progress through a known set of steps, like build, test, deploy, and verify.

Progress Live Activity showing percentage completion

Progress

Show percentage progress for jobs that move continuously toward completion.

Use a stable stream_key to identify the metric, job, deployment, or system you want to keep visible. The first stream(...) call starts the Live Activity. Later calls with the same stream_key update it.

Stats stream example
activitysmith.live_activities.stream(
"sales-hourly",
{
content_state: {
title: "Sales",
subtitle: "last hour",
type: "stats",
metrics: [
{ label: "Revenue", value: "$2430", color: "blue" },
{ label: "Orders", value: "37", color: "green" },
{ label: "Conversion", value: "4.8%", color: "magenta" },
{ label: "Avg Order", value: "$65.68", color: "yellow" },
{ label: "Refunds", value: "$84", color: "red" },
{ label: "New Buyers", value: "18", color: "cyan" }
]
}
}
)
Metrics stream example
activitysmith.live_activities.stream(
"prod-web-1",
{
content_state: {
title: "Server Health",
subtitle: "prod-web-1",
type: "metrics",
metrics: [
{ label: "CPU", value: 9, unit: "%" },
{ label: "MEM", value: 45, unit: "%" }
]
}
}
)
Segmented progress stream example
activitysmith.live_activities.stream(
"nightly-backup",
{
content_state: {
title: "Nightly Backup",
subtitle: "upload archive",
type: "segmented_progress",
number_of_steps: 3,
current_step: 2
}
}
)
Progress stream example
activitysmith.live_activities.stream(
"search-reindex",
{
content_state: {
title: "Search Reindex",
subtitle: "catalog-v2",
type: "progress",
percentage: 42
}
}
)

Call end_stream(...) with the same stream_key to dismiss the Live Activity. You can include final values before it is removed. By default, iOS removes the Live Activity after two minutes. Set auto_dismiss_minutes to choose a different dismissal time, including 0 for immediate dismissal.

activitysmith.live_activities.end_stream(
"prod-web-1",
{
content_state: {
title: "Server Health",
subtitle: "prod-web-1",
type: "metrics",
metrics: [
{ label: "CPU", value: 7, unit: "%" },
{ label: "MEM", value: 38, unit: "%" }
],
auto_dismiss_minutes: 2
}
}
)

Live Activities can include one optional action button. Use it to open a URL from the Live Activity or trigger a backend webhook.

Open URL action

Metrics Live Activity with action
activitysmith.live_activities.stream(
"prod-web-1",
{
content_state: {
title: "Server Health",
subtitle: "prod-web-1",
type: "metrics",
metrics: [
{ label: "CPU", value: 76, unit: "%" },
{ label: "MEM", value: 52, unit: "%" }
]
},
action: {
title: "Open Dashboard",
type: "open_url",
url: "https://ops.example.com/servers/prod-web-1"
}
}
)

Webhook action

Live Activity with an action button
activitysmith.live_activities.stream(
"search-reindex",
{
content_state: {
title: "Reindexing product search",
subtitle: "Shard 7 of 12",
type: "segmented_progress",
number_of_steps: 12,
current_step: 7
},
action: {
title: "Pause Reindex",
type: "webhook",
url: "https://ops.example.com/hooks/search/reindex/pause",
method: "POST",
body: {
job_id: "reindex-2026-03-19",
requested_by: "activitysmith-ruby"
}
}
}
)

Widgets

Lock screen widgets

ActivitySmith lets you display any value on your Lock Screen with widgets - SaaS metrics, revenue, number of users, uptime, or anything else you want to track. Create a metric in the web app, then update the metric value using our API, add a widget to your lock screen and it will fetch the latest update automatically.

Create widget metric
activitysmith.metrics.update("deploy.success_rate", 99.9)

String metric values work too.

activitysmith.metrics.update("prod.status", "healthy")

Integrate with any Ruby application

Keep your team aligned with immediate event delivery across incidents, business signals, and automation outcomes.

Explore Integrations

Connect ActivitySmith to automation and delivery platforms, then route runtime events to Push Notifications and Live Activities on your iOS devices.