---
title: "DropletWorkspaceService, DroppyKit"
description: "Things a droplet can ask the system to do on the user&#x27;s behalf."
canonical: "https://getdroppy.app/docs/droppykit/api/droplet-workspace-service"
last-updated: "2026-09-09"
---

# DropletWorkspaceService

Things a droplet can ask the system to do on the user's behalf.

`@MainActor protocol DropletWorkspaceService : AnyObject`

## Methods

### copyToPasteboard(_:)

`@discardableResult @MainActor func copyToPasteboard(_ text: String) -> Bool`

Copies plain text to the pasteboard. Requires `clipboard-write`.

### goBackInSettings()

`@discardableResult @MainActor func goBackInSettings() -> Bool`

Takes Droppy's Settings one step back, the way the toolbar's Back does, when the page on screen is one of this droplet's own.

For a page that finishes by itself: an editor's Save or Cancel, a picker's pick. A page reached through `openSettingsPage(_:title:)` or a [`DropletSettingsPageLink`](https://getdroppy.app/docs/droppykit/api/droplet-settings-page-link) goes back to the page it was reached from, with that page's title in the toolbar again. Needs DroppyKit 1.17.0: declare `minAPI` 1.17.0. Returns `false` when the host refused, which it does when the page on screen is not this droplet's.

### goBackInSettings()

`@discardableResult @MainActor func goBackInSettings() -> Bool`

A host older than 1.17.0 cannot step its Settings back for a droplet, and refuses.

### open(_:)

`@discardableResult @MainActor func open(_ url: URL) -> Bool`

Opens a URL in the user's default handler. Returns `false` when the host refused, which it does for schemes outside `http`, `https`, `mailto`, and `file` unless the droplet declared them.

### openSettings()

`@discardableResult @MainActor func openSettings() -> Bool`

Opens Droppy's Settings on this droplet's own page, the one your [`SettingsPaneProviding`](https://getdroppy.app/docs/droppykit/api/settings-pane-providing) pane is drawn on.

For the "Set up" button on a widget that has nothing to show until the user configures it. The window comes forward on its own; the shelf is left to close the way it normally does once the pointer leaves it. Needs DroppyKit 1.5.0: declare `minAPI` 1.5.0. Returns `false` when the host refused, for example for a droplet without a settings pane.

### openSettings()

`@discardableResult @MainActor func openSettings() -> Bool`

A host that cannot open a droplet's Settings page refuses.

### openSettingsPage(_:title:)

`@discardableResult @MainActor func openSettingsPage(_ id: String, title: String) -> Bool`

Opens Droppy's Settings on one of this droplet's own pages, the ones [`SettingsPagesProviding`](https://getdroppy.app/docs/droppykit/api/settings-pages-providing) builds, with `title` in the toolbar and Back leading to the droplet's page.

For a "Settings…" command of the droplet's own, so it lands where its Settings live instead of in a window of its own. Needs DroppyKit 1.13.0: declare `minAPI` 1.13.0. Returns `false` when the host refused, for example for a droplet that provides no pages.

### openSettingsPage(_:title:)

`@discardableResult @MainActor func openSettingsPage(_ id: String, title: String) -> Bool`

A host older than 1.13.0 has no droplet pages, and refuses.

### openShortcuts()

`@discardableResult @MainActor func openShortcuts() -> Bool`

Opens Droppy's Settings on the Shortcuts page, narrowed to this droplet's section, where every shortcut in Droppy is set.

For the place in a droplet's own settings where a recorder used to be. Needs DroppyKit 1.16.0: declare `minAPI` 1.16.0. Returns `false` when the host refused.

### openShortcuts()

`@discardableResult @MainActor func openShortcuts() -> Bool`

A host older than 1.16.0 lists no droplet shortcuts, and refuses.

### revealInFinder(_:)

`@MainActor func revealInFinder(_ url: URL)`

Reveals a file in Finder.
