
Live Activities now support a third activity type: metrics.
Use metrics to track server health, queue pressure, replica lag, worker saturation, and similar backend state you want visible on your lock screen at a glance.

const status = await activitysmith.liveActivities.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: "%" }, ], },});Call the same PUT /live-activity/stream/{stream_key} endpoint again whenever the values change. ActivitySmith keeps the Live Activity in sync on the device for you.
When the signal is no longer relevant, call DELETE /live-activity/stream/{stream_key} to end the Live Activity.
If your runtime already has state, you can use the start/update/end lifecycle to have full control over the Live Activity.

const start = await activitysmith.liveActivities.start({ content_state: { title: "Server Health", subtitle: "prod-web-1", type: "metrics", metrics: [ { label: "CPU", value: 76, unit: "%" }, { label: "MEM", value: 52, unit: "%" }, ], },});const activityId = start.activity_id;Store the returned activity_id and use the same metrics shape in update and end requests.
await activitysmith.liveActivities.update({ activity_id: activityId, content_state: { ... },});Available now across the API, SDKs, CLI, and GitHub Action.
This feature is available in the ActivitySmith iOS app version 1.5.0 and newer.

Live Activities now support a stateless stream mode.
I built this because while working on a new Live Activity type, I ran into a real limitation: lifecycle state management is fine in systems that already have state, but it becomes awkward in runtimes that wake up, do one thing, and exit.
GitHub Actions is a good example of where the original lifecycle still fits well. A workflow can start a Live Activity, keep the returned activity_id across steps, send updates, and end it when the run finishes.
A cron job is different. Each run can measure the current state of a process, but it does not naturally remember the activity_id from the previous run. You can bolt on a file, Redis key, or database row to persist it, but that means the integration is doing more state management than the job itself.
Stateless Live Activities remove that overhead.
PUT /live-activity/stream/{stream_key} endpoint for stateless start-or-update behavior.DELETE /live-activity/stream/{stream_key} endpoint to end the tracked Live Activity when the process is over.stream_key, so the caller does not need to persist activity_id.Pick one stable stream_key for one thing you are tracking.
Examples:
prod-web-1deployment-mainnightly-backupev-chargingUse one stream_key for one system, workflow, or process.
If no Live Activity exists yet for that key, ActivitySmith starts one. If one already exists, ActivitySmith updates it. If the current Live Activity needs to rotate, ActivitySmith handles that too.
The caller only sends the latest state.

In this example, a cron job runs on a VPS, reads the CPU usage of one PM2 process by ID, maps that value to a progress Live Activity, and sends it with the same stream_key every time.
The important part is what the script does not do:
activity_id#!/bin/bashset -euo pipefailAPI_BASE_URL="https://activitysmith.com/api"API_KEY="YOUR_API_KEY"STREAM_KEY="pm2-activitysmith-api-cpu"PM2_PROCESS_ID="0"cpu_raw=$(pm2 jlist | jq -r --arg id "$PM2_PROCESS_ID" ' map(select((.pm2_env.pm_id | tostring) == $id)) | .[0].monit.cpu')if [ -z "$cpu_raw" ] || [ "$cpu_raw" = "null" ]; then exit 1ficpu=$(printf "%.0f" "$cpu_raw")if [ "$cpu" -gt 100 ]; then cpu=100fiif [ "$cpu" -ge 80 ]; then color="red"elif [ "$cpu" -ge 40 ]; then color="yellow"else color="green"fipayload=$(cat <<EOF{ "content_state": { "title": "API Health", "subtitle": "PM2 activitysmith-api CPU", "type": "progress", "percentage": $cpu, "color": "$color" }}EOF)curl --fail --silent --show-error \ -X PUT "$API_BASE_URL/live-activity/stream/$STREAM_KEY" \ -H "Authorization: Bearer $API_KEY" \ -H "Content-Type: application/json" \ -d "$payload"Then let cron run it every minute:
* * * * * /opt/monitoring/pm2-cpu-live-activity.shOne run might send a green update at normal CPU usage.

A later run can spike the same Live Activity to yellow.

That is the whole point of stream mode: each execution is stateless, but the Live Activity stays continuous on the device.
Use stream mode when the caller should only send the latest state and move on.
Good fits:
Keep the original start/update/end lifecycle when the caller already has a natural place to keep state.
Good fits:
When the tracked process is over and you no longer want the Live Activity on devices, end the stream explicitly:
curl --fail --silent --show-error \ -X DELETE "https://activitysmith.com/api/live-activity/stream/pm2-activitysmith-api-cpu" \ -H "Authorization: Bearer YOUR_API_KEY"If you later send another PUT request with the same stream_key, ActivitySmith starts a new Live Activity for that stream again.
Available now across the API, SDKs, CLI, and GitHub Action.
This feature is available in the ActivitySmith iOS app version 1.5.0 and newer.

Live Activities now support optional action button.
Use it when a long-running job should stay actionable while progress is visible on the Lock Screen.
Open the GitHub Action run for a deployment, open a runbook, or trigger a backend webhook to pause or retry work without having to search for the right link or dashboard first.
action field on Live Activity start, update, and end requests.type:
open_url: opens the provided HTTPS URL in the browser.webhook: ActivitySmith backend calls the provided HTTPS webhook (GET or POST).segmented_progress and progress Live Activities.Use this to jump from the Live Activity straight into the deployment or CI page.
{ "content_state": { "title": "Deploying payments-api", "subtitle": "Running database migrations", "number_of_steps": 5, "current_step": 3, "type": "segmented_progress" }, "action": { "title": "Open Workflow", "type": "open_url", "url": "https://github.com/acme/payments-api/actions/runs/1234567890" }}Use this when the action should trigger backend behavior instead of opening a page.
{ "content_state": { "title": "Reindexing product search", "subtitle": "Shard 7 of 12", "number_of_steps": 12, "current_step": 7, "type": "segmented_progress" }, "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" } }}Available now across the API, SDKs, CLI, and GitHub Action.
This feature is available in the ActivitySmith iOS app version 1.4.0 and newer.

Push Notifications now support optional media.
Attach an image, video, or audio file to the notification itself so you can press and hold to preview media directly from the notification, then tap through to open the linked content.
This is a good fit for agent outputs, QA review flows, design previews, generated voice overs, and any backend workflow where the notification should carry the actual result, not just a line of text.
media field for push notifications.media can be combined with redirection.redirection is omitted, tapping the notification opens the media URL..jpg, .png, .gif, etc..mp3, .m4a, etc..mp4, .mov, etc.Content-Type, even if the path has no extension{ "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"}Available now across the API, SDKs, CLI, and GitHub Action.
This feature is available in the ActivitySmith iOS app version 1.3.0 and newer.

Live Activities now support a second activity type: progress.
Use progress when the work is naturally continuous instead of step-based.
It fits EV charging, file transfers, data sync progress, imports, downloads, uploads, and any job where a percentage or numeric range is clearer than "step 2 of 4".
progress type for Live Activities.percentage or value with upper_limit.segmented_progress for step-based workflows.segmented_progress still supports dynamic number_of_steps during update and end calls.segmented_progress: best for jobs tracked in steps.progress: best for jobs tracked as a percentage or numeric range.The lifecycle stays the same:
activity_id.
{ "content_state": { "title": "EV Charging", "subtitle": "Added 30 mi range", "percentage": 15, "type": "progress", "color": "lime" }}
{ "content_state": { "title": "EV Charging", "subtitle": "Added 120 mi range", "percentage": 60 }}
{ "content_state": { "title": "EV Charging", "subtitle": "Added 200 mi range", "percentage": 100, "auto_dismiss_minutes": 2 }}{ "content_state": { "title": "Data Sync", "subtitle": "241 of 360 records synced", "value": 241, "upper_limit": 360, "type": "progress", "color": "blue" }}Available now across the API, SDKs, CLI, GitHub Action, and ActivitySmith skill.
This feature is available in the ActivitySmith iOS app version 1.2.0 and newer.

Push Notifications now support optional redirection and actions fields.
Use redirection to open a URL when a user taps the notification. Use actions to show up to four buttons on long-press.
redirection: HTTPS URL opened on notification tap.actions: up to 4 action buttons shown on long-press.type:
open_url: opens the provided URL in browser.webhook: triggers backend webhook call (GET or POST).This feature is available in the ActivitySmith iOS app version 1.1.0 and newer.
{ "title": "Build Failed 🚨", "message": "CI pipeline failed on main branch", "redirection": "https://github.com/org/repo/actions/runs/123456789", "actions": [ { "title": "Open Failing Run", "type": "open_url", "url": "https://github.com/org/repo/actions/runs/123456789" }, { "title": "Create Incident", "type": "webhook", "url": "https://hooks.example.com/incidents/create", "method": "POST", "body": { "service": "payments-api", "severity": "high" } } ]}All SDKs, CLI, and the GitHub Action now support these optional fields in push notification requests.

ActivitySmith now provides a skill you can install with npx skills add to send Push Notifications and trigger Live Activities from your coding agents.
npx skills add ActivitySmithHQ/activitysmith-cli --skill activitysmithRepository: github.com/activitysmithhq/activitysmith-cli
./skills/activitysmith/scripts/send_push.sh \ -t "Codex task finished" \ -m "Implemented OAuth callback fix, added regression tests, and opened PR #128."
activity_id="$(./skills/activitysmith/scripts/start_activity.sh \ --title "Codex: migrate billing webhooks" \ --subtitle "Analyzing handlers" \ --type "segmented_progress" \ --steps 4 \ --current 1 \ --id-only)"./skills/activitysmith/scripts/update_activity.sh \ --activity-id "$activity_id" \ --title "Codex: migrate billing webhooks" \ --subtitle "Implementing + tests" \ --current 2./skills/activitysmith/scripts/end_activity.sh \ --activity-id "$activity_id" \ --title "Codex: migrate billing webhooks" \ --subtitle "Done" \ --current 4 \ --auto-dismiss 2
Use ACTIVITYSMITH_API_KEY for auth in your shell or environment.

ActivitySmith now integrates with Zapier so you can send iOS Push Notifications and Live Activities from your automations.
Connect ActivitySmith to any Zap and route runtime events from your apps, scripts, and workflows to paired team devices.
Visit ActivitySmith integration on Zapier for more details.

Use channels to route Push Notifications and Live Activities to specific users and devices.
Channels are now supported across all ActivitySmith SDKs and integrations, and the documentation has been updated with channel examples.

You can also scope API keys to specific channels for tighter control over where updates can be delivered.
Channels let you route updates to the right audience, for example: #engineering, #ios-builds, #marketing.
{ "title": "Build Failed", "message": "CI pipeline failed on main branch", "channels": ["ios-builds", "engineering"]}If channels are omitted, delivery behavior stays unchanged.

Add your team members to keep everyone notified and up to date with shared Push Notifications and Live Activities.
When your backend, scripts, or automations send push notifications or Live Activities, each update is delivered to all paired iOS devices on your team.


The official ActivitySmith SDK suite is now available across all major backend stacks.
You can now integrate ActivitySmith with:
# Node.js SDKnpm i activitysmith# Python SDKpip install activitysmith# Go SDKgo get github.com/ActivitySmithHQ/activitysmith-go# PHP SDKcomposer require activitysmith/activitysmith# Ruby SDKgem install activitysmith# ActivitySmith CLInpm i -g activitysmith-cliFull SDK documentation:

The official ActivitySmith GitHub Action is now live on the GitHub Marketplace.
Connect your CI and deployment workflows directly to ActivitySmith so your team gets real-time updates on their mobile devices.
You can now:
For lightweight updates like deploy completed, build failed, or rollback started, send a push notification in a single step:
- name: Send push notification with: action: send_push_notification api-key: ${{ secrets.ACTIVITYSMITH_API_KEY }} payload: | title: "ActivitySmith Deployment" message: "New release deployed to production."This is a good fit for one-off alerts where you want immediate visibility but no ongoing activity timeline.
For long-running workflows, start the activity, post as many progress updates as needed, then end it when complete.
The start_live_activity step returns live_activity_id, which you pass into update/end steps.
- name: Start live activity id: start_activity with: action: start_live_activity api-key: ${{ secrets.ACTIVITYSMITH_API_KEY }} payload: | content_state: title: "ActivitySmith API Deployment" subtitle: "ci: install & build" number_of_steps: 3 current_step: 1 type: "segmented_progress"- name: Update live activity with: action: update_live_activity api-key: ${{ secrets.ACTIVITYSMITH_API_KEY }} live-activity-id: ${{ steps.start_activity.outputs.live_activity_id }} payload: | content_state: title: "ActivitySmith API Deployment" subtitle: "ci: tests" current_step: 2- name: End live activity with: action: end_live_activity api-key: ${{ secrets.ACTIVITYSMITH_API_KEY }} live-activity-id: ${{ steps.start_activity.outputs.live_activity_id }} payload: | content_state: title: "ActivitySmith API Deployment" subtitle: "done" current_step: 3After months of building, ActivitySmith is live! Trigger Live Activities and send Push Notifications to your iOS device(s) with a simple API call.
Start here:
Try it now at activitysmith.com.