The ActivitySmith Ruby SDK provides convenient access to the ActivitySmith API from Ruby applications.
See API reference.
gem install activitysmithrequire"activitysmith"activitysmith=ActivitySmith::Client.new(api_key: ENV.fetch("ACTIVITYSMITH_API_KEY"))activitysmith.notifications.send({title: "New subscription 💸",message: "Customer upgraded to Pro plan"})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"})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.
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
Push notification redirection and actions are optional. Use them to open HTTPS URLs, run a specific iPhone Shortcut with shortcuts://run-shortcut?name=..., or trigger backend webhook workflows.
Webhooks are executed by the ActivitySmith backend.
activitysmith.notifications.send({title: "New subscription 💸",message: "Customer upgraded to Pro plan",redirection: "https://crm.example.com/customers/cus_9f3a1d",# Optionalactions: [# Optional (max 4){title: "Open CRM Profile",type: "open_url",url: "https://crm.example.com/customers/cus_9f3a1d"},{title: "Chat with Jarvis",type: "open_url",url: "shortcuts://run-shortcut?name=Jarvis"},{title: "Start Onboarding Workflow",type: "webhook",url: "https://hooks.example.com/activitysmith/onboarding/start",method: "POST",body: {customer_id: "cus_9f3a1d",plan: "pro"}}]})There are six types of Live Activities:
stats: best for showing business numbers side by side, such as revenue, sales, new users, conversion, refunds, or any other value you want visible at a glancemetrics: best for live percentage values that change often, like server CPU, memory usage, disk usage, or error ratesegmented_progress: best for anything that moves through clear stages, like deployments, onboarding flows, backups, ETL pipelines, migrations, and AI agent runsprogress: best for tracking real-time progress with percentage, like tasks, backups, migrations, syncs, or uploadsalert: best for status updates, such as feature adoption, reactivation, onboarding blockers, incidents, escalations, and other operational statestimer: best for countdowns and elapsed runtime, like benchmark runs, uploads, backups, transcodes, and long-running jobs
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.
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"}]}})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: "%"}]}})activitysmith.live_activities.stream("nightly-backup",{content_state: {title: "Nightly Backup",subtitle: "upload archive",type: "segmented_progress",number_of_steps: 3,current_step: 2}})activitysmith.live_activities.stream("search-reindex",{content_state: {title: "Search Reindex",subtitle: "catalog-v2",type: "progress",percentage: 42}})activitysmith.live_activities.stream("customer-ops",{content_state: ActivitySmith::LiveActivities.content_state(title: "Reactivation",message: "Lumen came back after 2 weeks",type: ActivitySmith::LiveActivities::TYPE_ALERT,icon: ActivitySmith::LiveActivities.alert_icon("cloud.sun",color: "yellow"),badge: ActivitySmith::LiveActivities.alert_badge("Customer",color: "magenta"))})activitysmith.live_activities.stream("benchmark-run",{content_state: {title: "Benchmark Run",subtitle: "sampling",type: "timer",duration_seconds: 300,color: "cyan"}})For a countdown, send duration_seconds. You can update title, subtitle, color, or any other visible field as the work changes. Leave duration_seconds out unless you want to change the timer.
To start at 00:00 and count up, set counts_down: false and leave out duration_seconds.
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 an action button.
open_url: open an HTTPS URL.open_urlwith ashortcuts://URL: run an Apple Shortcut, for example to open an app.webhook: trigger a backend GET/POST workflow.
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: "Dashboard",type: "open_url",url: "https://ops.example.com/servers/prod-web-1"}})activitysmith.live_activities.stream("deploy-payments-api",{content_state: {title: "Deploying payments-api",subtitle: "Running database migrations",type: "segmented_progress",number_of_steps: 5,current_step: 3},action: {title: "Chat with Jarvis",type: "open_url",url: "shortcuts://run-shortcut?name=Jarvis"}})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"}}})Use secondary_action when you want a second button beside the primary action.
The secondary action button is supported for alert, progress, and segmented_progress Live Activities. Both buttons use the same open_url, webhook, and Apple Shortcut payload shapes.
activitysmith.live_activities.stream("agent-approval",{content_state: ActivitySmith::LiveActivities.content_state(title: "Approval Needed",message: "Should I send the follow-up email to Brightlane?",type: "alert",color: "green",icon: ActivitySmith::LiveActivities.alert_icon("sparkles",color: "green"),badge: ActivitySmith::LiveActivities.alert_badge("Agent",color: "green")),action: {title: "Send",type: "webhook",url: "https://agent.example.com/live-activity/approve",method: "POST",body: {approval_id: "approval_01JY3J7Q9S0P8M1V5PZK7DR4M2",decision: "send"}},secondary_action: {title: "Deny",type: "webhook",url: "https://agent.example.com/live-activity/deny",method: "POST",body: {approval_id: "approval_01JY3J7Q9S0P8M1V5PZK7DR4M2",decision: "deny"}}})Add more context to Live Activities with icons and badges.
Supported Live Activity types: stats, metrics, progress, segmented_progress, alert, and timer.
activitysmith.live_activities.stream("prod-web-1",{content_state: ActivitySmith::LiveActivities.content_state(title: "Server Health",subtitle: "prod-web-1",type: "metrics",icon: ActivitySmith::LiveActivities.alert_icon("server.rack",color: "blue"),metrics: [{label: "CPU",value: 18,unit: "%"},{label: "MEM",value: 42,unit: "%"}])})The icon symbol value is an Apple SF Symbol name. Browse the catalog with one of these tools:
- ActivitySmith app - Open Settings -> SF Symbols to browse 45 hand-picked icons ready to use
- SF Symbols - Apple's official macOS app
- Interactful - free third-party iOS app listing all SF Symbols under Foundations -> Iconography
Badges are supported by alert, progress, and segmented_progress Live Activities.
activitysmith.live_activities.stream("nightly-database-backup",{content_state: ActivitySmith::LiveActivities.content_state(title: "Nightly Database Backup",subtitle: "verify restore",type: "progress",badge: ActivitySmith::LiveActivities.alert_badge("S3",color: "cyan"),percentage: 62)})Choose from these colors for the Live Activity accent, including progress bars and action buttons, or apply them to an individual icon or badge:
lime, green, cyan, blue, purple, magenta, red, orange, yellow, gray
ActivitySmith lets you display any value on your Lock Screen with widgets - SaaS metrics, revenue, signups, uptime, habits, 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.
activitysmith.metrics.update("deploy.success_rate",99.9)String metric values work too.
activitysmith.metrics.update("prod.status","healthy")Show the number you care about on your ActivitySmith app icon. Track MRR, a customer count, a stock price, or any other value you want to keep in view.
Set or update the badge value.
activitysmith.badge_count(8333)To clear the badge, set its value to 0.
activitysmith.badge_count(0)Use channels to target specific team members or devices
activitysmith.notifications.send({title: "New subscription 💸",message: "Customer upgraded to Pro plan",channels: ["sales","customer-success"]})activitysmith.live_activities.start({content_state: {title: "Nightly Database Backup",subtitle: "verify restore",type: "progress",percentage: 62},channels: ["sales","customer-success"]})activitysmith.badge_count(3,channels: ["sales","customer-success"])Use tags to organize and filter your Push Notification and Live Activity history. Tags are created automatically when you first use them.
activitysmith.notifications.send({title: "New subscription 💸",message: "Customer upgraded to Pro plan",tags: ["user:382","billing"]})beginactivitysmith.notifications.send({title: "New subscription 💸"})rescueOpenapiClient::ApiError=>errputs"Request failed: #{err.code}#{err.message}"end- Ruby 3.0+
MIT















