---
title: "LiveActivityProviding, DroppyKit"
description: "Adopt to show a compact live activity in the notch or island: small leading and trailing accessories beside the (simulated) notch."
canonical: "https://getdroppy.app/docs/droppykit/api/live-activity-providing"
last-updated: "2026-09-09"
---

# LiveActivityProviding

Adopt to show a compact live activity in the notch or island: small leading and trailing accessories beside the (simulated) notch.

`@MainActor protocol LiveActivityProviding : Droplet`

Adopt to show a compact live activity in the notch or island: small leading and trailing accessories beside the (simulated) notch. The row is compact only, like Droppy's own activities: hovering or clicking it opens the shelf, which is where your controls belong (see `makeExpanded(context:)`).

The host owns the presentation slot policy: publishing a state is a request, not a command, and a higher-priority activity (a phone call, a screen recording) can hold the slot.

External activities share a priority band below Droppy's built-in activities. `DroppyReplacesBuiltIn` is reserved host metadata and does not grant an external droplet a built-in activity's precedence.

- Note: Maturity: Stable. Covered by the 1.0 compatibility promise. Host support: mounted, and the seat is awarded: `compact` while your row is drawn, `secondary` while your activity rides the companion pill beside one of Droppy's own (only when the state sets `joinsPersistentActivitySet`), `outranked`, `surfaceSuppressed` or `idle` otherwise. See [Host support](https://getdroppy.app/docs/droppykit/host-support).

## Properties

### liveActivityState

`@MainActor var liveActivityState: AnyPublisher<LiveActivityState?, Never> { get }`

The droplet's current activity, or `nil` when idle. The host subscribes once at activation; publish on the main thread.

## Methods

### liveActivitySeatDidChange(_:)

`@MainActor func liveActivitySeatDidChange(_ seat: DropletLiveActivitySeat)`

The host moved this droplet's activity to a different seat (DroppyKit 0.6.0).

Publishing a state used to be a request into silence: a droplet could not tell whether it was on screen, riding the secondary pill, or losing to something it would never see. So it kept animating content nobody was looking at, and it had no honest answer when a user asked why the activity did not appear.

Use it to stop work, not to argue: there is no verb here for taking the seat back. A droplet that stops its ticker on [`none(_:)`](https://getdroppy.app/docs/droppykit/api/droplet-live-activity-seat#none) and restarts it on [`compact`](https://getdroppy.app/docs/droppykit/api/droplet-live-activity-seat#compact) is doing exactly what this exists for.

### liveActivitySeatDidChange(_:)

`@MainActor func liveActivitySeatDidChange(_ seat: DropletLiveActivitySeat)`

Default: ignore seat changes, which is what every droplet written against DroppyKit 0.5.0 and earlier already does.

### makeCompactLeading()

`@MainActor func makeCompactLeading() -> AnyView`

Small view rendered on the leading side of the notch while the activity holds the compact slot.

### makeCompactTrailing()

`@MainActor func makeCompactTrailing() -> AnyView`

Small view rendered on the trailing side of the notch while the activity holds the compact slot.

### makeCompanionCompact(context:)

`@MainActor func makeCompanionCompact(context: CompactLiveActivityContext) -> AnyView`

The mark rendered inside the round companion pill while this activity rides the secondary seat beside another activity (DroppyKit 0.7.0).

Defaults to `makeCompactLeading()`, which is what the host mounted there before this verb existed. Implement it when the leading wing accessory does not read at puck scale, and draw for the context's `slotSize`: the host holds the mark to that square, scaling anything larger down and clipping it, so a wing-sized view comes out small.

### makeCompanionCompact(context:)

`@MainActor func makeCompanionCompact(context: CompactLiveActivityContext) -> AnyView`

Default: the leading compact accessory, exactly what hosts mounted in the companion pill before DroppyKit 0.7.0.

### makeCompanionDetail(context:)

`@MainActor func makeCompanionDetail(context: LiveActivityContext) -> AnyView?`

Detail content revealed when the user hovers the companion pill and the host grows it into a wide capsule (the accordion), or `nil` to keep the centered companion mark during the grow (DroppyKit 0.7.0).

The view is laid out leading-aligned beside the companion mark inside the grown capsule. Keep it to a line or two of text-scale content; the interactive surface remains `makeExpanded(context:)`.

### makeCompanionDetail(context:)

`@MainActor func makeCompanionDetail(context: LiveActivityContext) -> AnyView?`

Default: no accordion detail; the companion keeps its centered mark while the capsule grows.

### makeExpanded(context:)

`@MainActor func makeExpanded(context: LiveActivityContext) -> AnyView`

A card for the compact activity, which Droppy does not mount.

A droplet's live activity behaves exactly like Droppy's own: hovering or clicking the row opens the shelf, where the droplet's shelf widget is, and no card grows out of the row (DroppyKit 1.8.1). The requirement stays so droplets already built keep loading; return an empty view in a new droplet and put controls in a shelf widget.
