Skip to content

ActivitySmithHQ/activitysmith-php

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

68 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

ActivitySmith PHP SDK

The ActivitySmith PHP SDK provides convenient access to the ActivitySmith API from PHP applications.

Documentation

See API reference.

Table of Contents

Installation

composer require activitysmith/activitysmith

Setup

<?php

declare(strict_types=1);

use ActivitySmith\ActivitySmith;
use ActivitySmith\LiveActivities;
use ActivitySmith\LiveActivityAction;
use ActivitySmith\LiveActivityAlertBadge;
use ActivitySmith\LiveActivityAlertIcon;
use ActivitySmith\LiveActivityContentState;
use ActivitySmith\LiveActivityMetric;
use ActivitySmith\PushAction;

$activitysmith = new ActivitySmith($_ENV['ACTIVITYSMITH_API_KEY']);

Push Notifications

Send a Push Notification

Push notification example

$activitysmith->notifications->send(
    title: 'New subscription 💸',
    message: 'Customer upgraded to Pro plan',
);

Rich Push Notifications with Media

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',
);

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.

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

Actionable Push Notifications

Actionable push notification example

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', // Optional
    actions: [ // Optional (max 4)
        PushAction::make(
            title: 'Open CRM Profile',
            type: 'open_url',
            url: 'https://crm.example.com/customers/cus_9f3a1d',
        ),
        PushAction::make(
            title: 'Chat with Jarvis',
            type: 'open_url',
            url: 'shortcuts://run-shortcut?name=Jarvis',
        ),
        PushAction::make(
            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

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 glance
  • metrics: best for live percentage values that change often, like server CPU, memory usage, disk usage, or error rate
  • segmented_progress: best for anything that moves through clear stages, like deployments, onboarding flows, backups, ETL pipelines, migrations, and AI agent runs
  • progress: best for tracking real-time progress with percentage, like tasks, backups, migrations, syncs, or uploads
  • alert: best for status updates, such as feature adoption, reactivation, onboarding blockers, incidents, escalations, and other operational states
  • timer: best for countdowns and elapsed runtime, like benchmark runs, uploads, backups, transcodes, and long-running jobs

Start & Update Live Activity

Use a stable streamKey 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 streamKey update it.

Stats

Stats Live Activity stream example

$activitysmith->liveActivities->stream(
    'sales-hourly',
    contentState: LiveActivityContentState::make(
        title: 'Sales',
        subtitle: 'last hour',
        type: 'stats',
        metrics: [
            LiveActivityMetric::make(label: 'Revenue', value: '$2430', color: 'blue'),
            LiveActivityMetric::make(label: 'Orders', value: '37', color: 'green'),
            LiveActivityMetric::make(label: 'Conversion', value: '4.8%', color: 'magenta'),
            LiveActivityMetric::make(label: 'Avg Order', value: '$65.68', color: 'yellow'),
            LiveActivityMetric::make(label: 'Refunds', value: '$84', color: 'red'),
            LiveActivityMetric::make(label: 'New Buyers', value: '18', color: 'cyan'),
        ],
    ),
);

Metrics

Metrics Live Activity stream example

$activitysmith->liveActivities->stream(
    'prod-web-1',
    contentState: LiveActivityContentState::make(
        title: 'Server Health',
        subtitle: 'prod-web-1',
        type: 'metrics',
        metrics: [
            LiveActivityMetric::make(label: 'CPU', value: 9, unit: '%'),
            LiveActivityMetric::make(label: 'MEM', value: 45, unit: '%'),
        ],
    ),
);

Segmented Progress

Segmented Progress Live Activity stream example

$activitysmith->liveActivities->stream(
    'nightly-backup',
    contentState: LiveActivityContentState::make(
        title: 'Nightly Backup',
        subtitle: 'upload archive',
        type: 'segmented_progress',
        numberOfSteps: 3,
        currentStep: 2,
    ),
);

Progress

Progress Live Activity stream example

$activitysmith->liveActivities->stream(
    'search-reindex',
    contentState: LiveActivityContentState::make(
        title: 'Search Reindex',
        subtitle: 'catalog-v2',
        type: 'progress',
        percentage: 42,
    ),
);

Alert

Alert Live Activity stream example

$activitysmith->liveActivities->stream(
    'customer-ops',
    contentState: LiveActivityContentState::make(
        title: 'Reactivation',
        message: 'Lumen came back after 2 weeks',
        type: 'alert',
        icon: LiveActivityAlertIcon::make(symbol: 'cloud.sun', color: 'yellow'),
        badge: LiveActivityAlertBadge::make(title: 'Customer', color: 'magenta'),
    ),
);

Timer

Timer Live Activity showing a benchmark run countdown

$activitysmith->liveActivities->stream(
    'benchmark-run',
    contentState: LiveActivityContentState::make(
        title: 'Benchmark Run',
        subtitle: 'sampling',
        type: 'timer',
        durationSeconds: 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.

End Live Activity

Call endStream(...) with the same streamKey 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 autoDismissMinutes to choose a different dismissal time, including 0 for immediate dismissal.

$activitysmith->liveActivities->endStream(
    'prod-web-1',
    contentState: LiveActivityContentState::make(
        title: 'Server Health',
        subtitle: 'prod-web-1',
        type: 'metrics',
        metrics: [
            LiveActivityMetric::make(label: 'CPU', value: 7, unit: '%'),
            LiveActivityMetric::make(label: 'MEM', value: 38, unit: '%'),
        ],
        autoDismissMinutes: 2,
    ),
);

Live Activity Action

Live Activities can include one optional action button.

  • open_url: open an HTTPS URL.
  • open_url with a shortcuts://run-shortcut?name=... URL: run a specific iPhone Shortcut, for example to open an app.
  • webhook: trigger a backend GET/POST workflow.

Live Activity with action button

Open URL action

$activitysmith->liveActivities->stream(
    'prod-web-1',
    contentState: LiveActivityContentState::make(
        title: 'Server Health',
        subtitle: 'prod-web-1',
        type: 'metrics',
        metrics: [
            LiveActivityMetric::make(label: 'CPU', value: 76, unit: '%'),
            LiveActivityMetric::make(label: 'MEM', value: 52, unit: '%'),
        ],
    ),
    action: LiveActivityAction::make(
        title: 'Dashboard',
        type: 'open_url',
        url: 'https://ops.example.com/servers/prod-web-1',
    ),
);

Apple Shortcut action

$activitysmith->liveActivities->stream(
    'deploy-payments-api',
    contentState: LiveActivityContentState::make(
        title: 'Deploying payments-api',
        subtitle: 'Running database migrations',
        type: 'segmented_progress',
        numberOfSteps: 5,
        currentStep: 3,
    ),
    action: LiveActivityAction::make(
        title: 'Chat with Jarvis',
        type: 'open_url',
        url: 'shortcuts://run-shortcut?name=Jarvis',
    ),
);

Webhook action

$activitysmith->liveActivities->stream(
    'search-reindex',
    contentState: LiveActivityContentState::make(
        title: 'Reindexing product search',
        subtitle: 'Shard 7 of 12',
        type: 'segmented_progress',
        numberOfSteps: 12,
        currentStep: 7,
    ),
    action: LiveActivityAction::make(
        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-php',
        ],
    ),
);

Icons and Badges

Add more context to Live Activities with icons and badges.

Icon

Supported Live Activity types: stats, metrics, progress, segmented_progress, alert, and timer.

Metrics Live Activity with an SF Symbol icon on the iPhone Lock Screen

$activitysmith->liveActivities->stream(
    'prod-web-1',
    contentState: LiveActivityContentState::make(
        title: 'Server Health',
        subtitle: 'prod-web-1',
        type: LiveActivities::TYPE_METRICS,
        icon: LiveActivityAlertIcon::make(symbol: 'server.rack', color: 'blue'),
        metrics: [
            LiveActivityMetric::make(label: 'CPU', value: 18, unit: '%'),
            LiveActivityMetric::make(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

Badge

Badges are supported by alert, progress, and segmented_progress Live Activities.

Progress Live Activity with a badge on the iPhone Lock Screen

$activitysmith->liveActivities->stream(
    'nightly-database-backup',
    contentState: LiveActivityContentState::make(
        title: 'Nightly Database Backup',
        subtitle: 'verify restore',
        type: LiveActivities::TYPE_PROGRESS,
        badge: LiveActivityAlertBadge::make(title: 'S3', color: 'cyan'),
        percentage: 62,
    ),
);

Live Activity Colors

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

Channels

Channels are used to target specific team members or devices. Can be used for both push notifications and live activities.

$activitysmith->notifications->send(
    title: 'New subscription 💸',
    message: 'Customer upgraded to Pro plan',
    channels: ['sales', 'customer-success'], // Optional
);

Widgets

Lock screen widgets

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.

Create widget metric

$activitysmith->metrics->update('deploy.success_rate', 99.9);

String metric values work too.

$activitysmith->metrics->update('prod.status', 'healthy');

Error Handling

try {
    $activitysmith->notifications->send(
        title: 'New subscription 💸',
    );
} catch (Throwable $err) {
    echo 'Request failed: ' . $err->getMessage() . PHP_EOL;
}

Requirements

  • PHP 8.1+

License

MIT

About

PHP library for the ActivitySmith API

Topics

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages