
Live Activities now support a new activity type: stats.
Use stats to track several values at once. It fits up to 8 labeled values, such as revenue, number of users, conversion, uptime, or any metric set you want visible at a glance.
Each item has a label and value. Add an optional color when you want a small visual cue. Leave it out when you want plain text.
const status = await activitysmith.liveActivities.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" }, ], },});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 stats are no longer relevant, call DELETE /live-activity/stream/{stream_key} to end the Live Activity.
Stats Live Activities can include the same optional action button as other Live Activity types. Use it to open the dashboard or report behind the numbers.
Set the action title to Dashboard, use open_url, and provide an HTTPS URL.

const status = await activitysmith.liveActivities.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" }, ], }, action: { title: "Dashboard", type: "open_url", url: "https://analytics.example.com/sales", },});Available now across the API, SDKs, and CLI.
This feature is available in the ActivitySmith iOS app version 1.8.0 and newer.

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.

When creating a metric, you can choose the format: number, currency, percent, unit, or string.
Call the update method with the metric key and the latest value:
await activitysmith.metrics.update("deploy.success_rate", 99.9);The widget fetches the latest value about every 15 minutes. iOS manages the refresh schedule.
There are multiple widget types to choose from, depending on how you want the metric to appear on your Lock Screen.

Lock Screen widgets are available in the ActivitySmith iOS app version 1.7.0 and newer.

You can now track n8n workflows on your Lock Screen. Show live progress for long-running executions with Live Activities and send a Push Notification to your devices when something important happens.
Install n8n-nodes-activitysmith in n8n, add the ActivitySmith node to your workflow, and connect your ActivitySmith API key.
From there, choose what the node should do:
Each action can use values from earlier n8n nodes. Map the workflow name, activity_id, status, result URL, or any other field you already have in the execution.
For long-running workflows, start a live activity near the beginning of the run. Update it as each stage completes, then end it when the workflow succeeds or fails.
A Live Activity can show the current step, progress, and status on the Lock Screen. It can also include an action button, so tapping the activity can open the n8n workflow URL or any other link you provide.

Use a push notification when the workflow reaches a point someone should know about immediately.
Good examples:


Use ActivitySmith to get Vercel deployment events on your iOS devices instead of buried in a dashboard tab. Add the generated inbound webhook URL to your Vercel project, choose the events you care about, and route them into Push Notifications and Live Activities for your team.
Start with a preset, not a blank canvas. Pick a ready-to-use preset for a deployment Live Activity, production deploy push notifications, or failed-deploy alerts and the webhook is wired up in seconds - then customize titles, actions, routing, and payload mapping however you want.

The Vercel dashboard is great when you are sitting in front of it. It is not great for shared visibility when a production ship is in flight and the team is in a meeting, on a walk, or heads-down in another tool.
ActivitySmith puts the same events on the lock screen and in the ActivitySmith log, with links and actions that take people straight to the right Vercel deployment.
Track production ships live. A production deploy is exactly the kind of long-running event Live Activities were built for. Start one when deployment.created fires, update it through build and promote, and close it when deployment.succeeded or deployment.error lands.
Route failures differently from the rest. Filter on target so production deployment.error and deployment.canceled page on-call, while preview deploys stay quiet on a low-priority channel.

Catch broken deploys without refreshing the dashboard. When deployment.error fires, send a push notification with the project, branch, commit, and inspector URL so whoever is closest can open the failing build in one tap.

You can use the preset as-is, or keep editing from there. Change the wording, map different payload fields (deployment URL, commit SHA, author, target), and add an action that opens the deployment in Vercel, the live URL, or an internal runbook on tap.

Use ActivitySmith to get Netlify deploy and form submission events on your iOS devices instead of buried in email. Add the generated inbound webhook URL to Netlify, choose the events you care about, and route them into Push Notifications and Live Activities for your team.
Start with a preset, not a blank canvas. There are ready-to-use presets for a deploy Live Activity, deploy status push notifications, and form submission push notifications, so you can get the first event flowing fast - then customize titles, actions, routing, and payload mapping however you want.

Netlify emails the account owner on deploys and forwards form submissions to whoever is configured on the form. That works as a record. It is not great for shared visibility when something needs attention right now.
ActivitySmith puts the same events on the lock screen and in the ActivitySmith log, with links and actions that take people straight to the right Netlify page.
Track deployments live. Long-running deploys are a better fit for Live Activities than inbox threads. Start one when a deploy begins, update it as status changes, and let it disappear a few minutes after success or failure.
Route failures differently from the rest. Filter by deploy context so production deploy_failed and deploy_locked go straight to on-call while preview deploys stay quiet.

See new form submissions in seconds. When submission_created fires, send a push notification with the form name, submitter, and mapped fields so a new lead or support request shows up immediately instead of sitting in an inbox no one is watching.

You can use the preset as-is, or keep editing from there. Change the wording, map different payload fields, and add an action that opens the matching Netlify page on tap.
The ActivitySmith app icon is the one you look at every time a push notification lands on your lock screen. It should feel like yours.
You can now pick from 36 custom app icons - no ActivitySmith branding. Tap Settings → App Icon inside the app and choose the one that fits.
200, 2xx, 404, 503, and more.CORE, FEED, SYNC, LINK, and others.There's a known iOS bug where push notifications can still render the default icon on the lock screen even after you switch. Apple has acknowledged it and a fix is pending.
Until then, the workaround is simple:
New push notifications will then show your chosen icon on the lock screen.
Available in the ActivitySmith iOS app version 1.6.0 and newer.

Use ActivitySmith to get Sentry issues, assignments, regressions, and metric alerts on your iOS devices instead of buried in inboxes or waiting inside the Sentry UI. Register the generated endpoint as a Sentry Internal Integration, subscribe to the resources you care about, and route them into push notifications for your team.

Sentry emails the assignee and pings the project's notification settings. That works for individual triage. It is not great for shared response when the right people need to see the same signal fast.
ActivitySmith puts those events on the lock screen and in the ActivitySmith log, with links and actions that take people straight to the right Sentry page.
Regressions get their own channel. A resolved issue reappearing is worth waking up for. Filter on issue.unresolved and route regressions away from the noise of brand-new issues.
Assignments hit the team, not one inbox. Route issue.assigned events to a shared on-call or backend channel. The person who should look at it gets the push - whether or not they caught the email.
Critical metric alerts in seconds. Push metric_alert.critical and event_alert.triggered straight to the lock screen. SLO burn, error spikes, and p95 breaches surface immediately instead of waiting for someone to open Sentry.
One place for all your team's event routing. If you're already routing GitHub, Linear, or deployment events through ActivitySmith, Sentry alerts land in the same channels with the same setup.


Use ActivitySmith to get Linear issue, cycle, and project events on your iOS devices based on priority, project, or label - not just whoever happens to be assigned or following the issue. Paste the generated endpoint into Linear, subscribe to the events you want, and route them into push notifications for your team.

Linear's iOS app notifies you about issues you're assigned to or following. That works for your personal queue. It is not enough when the team wants routing based on severity, workflow stage, or project.
ActivitySmith puts those events on the lock screen and in the ActivitySmith log, so the right people see the handoff immediately.
Route by priority, not by assignment. Any P1 issue created in your workspace can go straight to #on-call. No one misses it because they weren't the assignee or weren't following the issue.
Shared sprint visibility. Cycle start and close events can land in a team channel so everyone knows the sprint boundary - without a standup or a manual message to check.
Visibility beyond Linear users. Managers, founders, or adjacent teams who don't live in Linear can still get the signal. Route project milestones and status changes to anyone with ActivitySmith - no Linear account required.
One place for all your team's event routing. If you're already routing GitHub Actions and deployment events through ActivitySmith, Linear fits into the same channels and the same setup.


Use ActivitySmith to get GitHub deploys, pull requests, checks, and workflow runs on your iOS devices instead of refreshing Actions or waiting for email. Pair the generated endpoint with a GitHub repository or organization, pick the events you care about, and route them into push notifications or Live Activities for your team.
Push notifications are the right fit for handoffs and conclusions. Live Activities are a better fit for CI runs, deploys, and other long-running work you want visible from the lock screen while it is still moving.

Send handoffs as push notifications. Failed checks, merged pull requests, and deployment conclusions are moments someone should see right away. Route those events to the right channel so the next step is obvious the moment GitHub emits it.

Track long-running work with Live Activities. Workflow runs and deployment-style events are easier to follow as a single live line on the lock screen than as a pile of separate notifications.


Use inbound webhooks when the service you care about does not have a native ActivitySmith integration yet. Railway deploys, GitLab pipelines, internal tools, and any custom JSON source can send events into ActivitySmith so your team sees backend work on the lock screen while it is still happening.
Choose Live Activities for rollouts, pipelines, and other long-running work. Choose push notifications for one-off outcomes, failures, and handoffs that someone should see immediately.
ActivitySmith accepts inbound webhooks from Railway, GitLab, and any service that sends custom JSON.

Webhooks also support secret-token verification and channel targeting, so incoming events can be checked before processing and routed to the right people and devices.
Railway deployment state can stay visible from rollout start to success or failure, without turning the release into another tab to watch.
For example, deployment start and progress events can update a Live Activity, then production success or failure can arrive as a Push Notification.

Good fits:
GitLab pipeline, review, and release state can follow the work from the lock screen while it moves.
You can route pipeline events to Live Activities, send Push Notifications for failed jobs or review handoffs, and open the related GitLab page from the notification action.

Generic webhooks are the escape hatch.
If a service can send JSON, it can send an event into ActivitySmith. Paste a sample payload, map JSON fields into the notification or Live Activity text, and choose the delivery mode that fits the event.
For optional verification, send the generated secret in:
X-ActivitySmith-Webhook-Secret: YOUR_SECRETThis is useful for internal tools, workers, cron jobs, low-code automations, or webhook providers that do not need a dedicated preset yet.
Inbound webhooks include a delivery log for the inevitable "did the webhook fire?" moment.

Inbound webhooks are available now in the ActivitySmith dashboard.
Start with Railway, GitLab, or Generic JSON, then choose whether that endpoint should deliver Push Notifications or Live Activities.
More integrations such as Vercel, Sentry, Stripe, and Polar are coming soon.

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.