---
title: "@henryqw/pi-bark"
seo:
  description: "Send Pi session status and agent output to Bark on iOS."
---

<div class="not-prose my-6 flex flex-wrap items-center gap-3"><a href="https://www.npmjs.com/package/@henryqw/pi-bark" aria-label="View @henryqw/pi-bark version v0.1.3 on npm"><img alt="Version v0.1.3" height="20" src="https://img.shields.io/static/v1?cacheSeconds=7200&amp;color=1d4ed8&amp;label=version&amp;labelColor=6a7282&amp;style=flat-square&amp;message=v0.1.3" width="96"></a><div class="ml-auto flex flex-wrap items-center justify-end gap-3"><a href="https://www.npmjs.com/package/@henryqw/pi-bark" aria-label="View @henryqw/pi-bark on npm"><img alt="Monthly npm downloads" height="20" src="https://img.shields.io/npm/dm/%40henryqw%2Fpi-bark?cacheSeconds=7200&amp;color=1d4ed8&amp;label=downloads&amp;labelColor=6a7282&amp;style=flat-square" width="144"></a><a href="https://github.com/HenryQW/pi-harness/blob/main/extensions/pi-bark/LICENSE" aria-label="View the MIT license for @henryqw/pi-bark"><img alt="MIT license" height="20" src="https://img.shields.io/npm/l/%40henryqw%2Fpi-bark?cacheSeconds=7200&amp;color=1d4ed8&amp;label=license&amp;labelColor=6a7282&amp;style=flat-square" width="78"></a></div></div>

Get [Bark](https://bark.day.app) notifications when Pi finishes or needs your input. Use `/copyb` to send Pi's latest response to your device.

## Install

```bash
pi install npm:@henryqw/pi-bark
```

### Setup

1. Open the Bark App and copy its test URL.
2. Take the Device Key from the URL.
3. Run `/set-bark` in Pi.

For Bark's public server:

```text
/set-bark your-device-key
```

For a self-hosted Bark server:

```text
/set-bark your-device-key https://bark.example.com
```

A test URL such as `https://api.day.app/your-device-key/Test` contains the Device Key after the host. Do not include sample push content such as `/Test`.

Treat the Device Key as a secret. Anyone with it can send push notifications to your device.

## Use

Run `/copyb` with no arguments.

The command copies the last agent message to your clipboard. It then sends a Bark V2 push request to `<serverUrl>/push`.

Without push encryption, the JSON request uses Bark's standard parameter names:

```json
{
  "device_key": "your-device-key",
  "body": "the last agent message"
}
```

The `body` value is the same text that Pi's `/copy` command selects. Markdown, code blocks, spacing, and line breaks stay unchanged.

| Surface | Type | Purpose |
| --- | --- | --- |
| `/copyb` | command | Copy the last agent message and send a Bark push notification. |
| `/set-bark <device-key> [server-url]` | command | Save the Device Key and Bark server URL. |
| `/bark-notifications on\|off\|inherit` | command | Override automatic status notifications for the current CWD. |
| `/bark-notifications default on\|off` | command | Set the default for CWDs without an override. |
| `pi-bark-key [--force \| --disable]` | executable | Generate, replace, or disable the Custom Encryption Key. |

### Automatic status notifications

After setup, pi-bark sends two status-only notifications:

- **Pi needs input** when Pi opens a blocking user prompt, including `ask_question`.
- **Pi finished** after the agent has fully settled and will not continue automatically.

Each notification includes Pi's current session name. Herdr shows the same name when `pi-herdr-rename` is active. pi-bark does not call Herdr or read Herdr state.

An unset session name appears as `Unnamed`. Status notifications do not include prompts or agent output. No notification is sent when a prompt closes.

Automatic notifications are enabled by default. Disable them only in the current CWD:

```text
/bark-notifications off
```

Use `on` to enable the current CWD explicitly. Use `inherit` to remove its override. The CWD then follows the global default.

Change that default for all CWDs without an override:

```text
/bark-notifications default off
```

These settings do not affect `/copyb`. CWD overrides live in pi-bark's global config, not in project files.

## Flow

![Architecture showing copyb and Pi status notifications entering one shared sender, using AES256-GCM, passing ciphertext through the Bark server, and decrypting locally in the Bark App.](data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTI4MCIgaGVpZ2h0PSI3MjAiIHZpZXdCb3g9IjAgMCAxMjgwIDcyMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiByb2xlPSJpbWciIGFyaWEtbGFiZWxsZWRieT0icHVzaC1lbmNyeXB0aW9uLWZsb3ctdGl0bGUgcHVzaC1lbmNyeXB0aW9uLWZsb3ctZGVzYyI+CiAgICAgIDx0aXRsZSBpZD0icHVzaC1lbmNyeXB0aW9uLWZsb3ctdGl0bGUiPkhvdyBwaS1iYXJrIGVuY3J5cHRzIGV2ZXJ5IHB1c2g8L3RpdGxlPgogICAgICA8ZGVzYyBpZD0icHVzaC1lbmNyeXB0aW9uLWZsb3ctZGVzYyI+QXJjaGl0ZWN0dXJlIGRpYWdyYW0gc2hvd2luZyBjb3B5YiBtZXNzYWdlcyBhbmQgYXV0b21hdGljIFBpIHN0YXR1cyBldmVudHMgZW50ZXJpbmcgb25lIHNoYXJlZCBzZW5kZXIuIFdoZW4gdGhlIGNvbmZpZyBjb250YWlucyBhIGN1c3RvbSBrZXksIGV2ZXJ5IHB1c2ggdXNlcyBBRVMyNTYtR0NNIHdpdGggYSBmcmVzaCAxMi1ieXRlIElWIGJlZm9yZSBCYXJrIGZvcndhcmRzIHRoZSBjaXBoZXJ0ZXh0IHRvIHRoZSBhcHAgZm9yIGxvY2FsIGRlY3J5cHRpb24uPC9kZXNjPgogICAgICA8ZGVmcz4KICAgICAgICA8c3R5bGU+QGltcG9ydCB1cmwoJ2h0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzMj9mYW1pbHk9SW5zdHJ1bWVudCtTZXJpZjppdGFsQDA7MSZhbXA7ZmFtaWx5PUdlaXN0OndnaHRANDAwOzUwMDs2MDAmYW1wO2ZhbWlseT1HZWlzdCtNb25vOndnaHRANDAwOzUwMDs2MDAmYW1wO2Rpc3BsYXk9c3dhcCcpOzwvc3R5bGU+CiAgICAgICAgPHN0eWxlPgogICAgICAgICAgLmV5ZWJyb3cgeyBmaWxsOiAjNGM1NjY1OyBmb250OiA1MDAgOHB4ICdHZWlzdCBNb25vJywgbW9ub3NwYWNlOyBsZXR0ZXItc3BhY2luZzogLjE2ZW07IH0KICAgICAgICAgIC5oZWFkaW5nIHsgZmlsbDogIzEwMTgyODsgZm9udDogNDAwIDI4cHggJ0luc3RydW1lbnQgU2VyaWYnLCBzZXJpZjsgfQogICAgICAgICAgLmludHJvIHsgZmlsbDogIzRjNTY2NTsgZm9udDogNDAwIDEycHggJ0dlaXN0Jywgc2Fucy1zZXJpZjsgfQogICAgICAgICAgLnpvbmUgeyBmaWxsOiAjZTZlNGRlOyBzdHJva2U6ICMxMDE4Mjg7IHN0cm9rZS1vcGFjaXR5OiAuMTQ7IHN0cm9rZS13aWR0aDogMTsgfQogICAgICAgICAgLnpvbmUtbGFiZWwgeyBmaWxsOiAjNmE3MjgyOyBmb250OiA1MDAgOHB4ICdHZWlzdCBNb25vJywgbW9ub3NwYWNlOyBsZXR0ZXItc3BhY2luZzogLjE2ZW07IH0KICAgICAgICAgIC5ib3VuZGFyeSB7IGZpbGw6IG5vbmU7IHN0cm9rZTogIzFkNGVkODsgc3Ryb2tlLW9wYWNpdHk6IC41MDsgc3Ryb2tlLXdpZHRoOiAxOyBzdHJva2UtZGFzaGFycmF5OiA0IDQ7IH0KICAgICAgICAgIC5ib3VuZGFyeS1sYWJlbCB7IGZpbGw6ICMxZDRlZDg7IGZvbnQ6IDUwMCA4cHggJ0dlaXN0IE1vbm8nLCBtb25vc3BhY2U7IGxldHRlci1zcGFjaW5nOiAuMTJlbTsgfQogICAgICAgICAgLm5vZGUtbWFzayB7IGZpbGw6ICNmMGVlZTk7IH0KICAgICAgICAgIC5ub2RlIHsgZmlsbDogI2ZmZmZmZjsgc3Ryb2tlOiAjMTAxODI4OyBzdHJva2Utd2lkdGg6IDE7IH0KICAgICAgICAgIC5ub2RlLWlucHV0IHsgZmlsbDogIzRjNTY2NTsgZmlsbC1vcGFjaXR5OiAuMTA7IHN0cm9rZTogIzZhNzI4Mjsgc3Ryb2tlLXdpZHRoOiAxOyB9CiAgICAgICAgICAubm9kZS1zdG9yZSB7IGZpbGw6ICMxMDE4Mjg7IGZpbGwtb3BhY2l0eTogLjA1OyBzdHJva2U6ICM0YzU2NjU7IHN0cm9rZS13aWR0aDogMTsgfQogICAgICAgICAgLm5vZGUtZXh0ZXJuYWwgeyBmaWxsOiAjMTAxODI4OyBmaWxsLW9wYWNpdHk6IC4wMzsgc3Ryb2tlOiAjMTAxODI4OyBzdHJva2Utb3BhY2l0eTogLjMwOyBzdHJva2Utd2lkdGg6IDE7IH0KICAgICAgICAgIC5ub2RlLWZvY2FsIHsgZmlsbDogIzFkNGVkODsgZmlsbC1vcGFjaXR5OiAuMDg7IHN0cm9rZTogIzFkNGVkODsgc3Ryb2tlLXdpZHRoOiAxLjI7IH0KICAgICAgICAgIC50YWcgeyBmaWxsOiBub25lOyBzdHJva2U6ICMxMDE4Mjg7IHN0cm9rZS1vcGFjaXR5OiAuMzQ7IHN0cm9rZS13aWR0aDogLjg7IH0KICAgICAgICAgIC50YWctZm9jYWwgeyBmaWxsOiBub25lOyBzdHJva2U6ICMxZDRlZDg7IHN0cm9rZS1vcGFjaXR5OiAuNTU7IHN0cm9rZS13aWR0aDogLjg7IH0KICAgICAgICAgIC50YWctdGV4dCB7IGZpbGw6ICM2YTcyODI7IGZvbnQ6IDUwMCA4cHggJ0dlaXN0IE1vbm8nLCBtb25vc3BhY2U7IGxldHRlci1zcGFjaW5nOiAuMDhlbTsgdGV4dC1hbmNob3I6IG1pZGRsZTsgfQogICAgICAgICAgLnRhZy10ZXh0LWZvY2FsIHsgZmlsbDogIzFkNGVkODsgZm9udDogNTAwIDhweCAnR2Vpc3QgTW9ubycsIG1vbm9zcGFjZTsgbGV0dGVyLXNwYWNpbmc6IC4wOGVtOyB0ZXh0LWFuY2hvcjogbWlkZGxlOyB9CiAgICAgICAgICAubmFtZSB7IGZpbGw6ICMxMDE4Mjg7IGZvbnQ6IDYwMCAxMnB4ICdHZWlzdCcsIHNhbnMtc2VyaWY7IHRleHQtYW5jaG9yOiBtaWRkbGU7IH0KICAgICAgICAgIC5zdWIgeyBmaWxsOiAjNGM1NjY1OyBmb250OiA0MDAgOHB4ICdHZWlzdCBNb25vJywgbW9ub3NwYWNlOyB0ZXh0LWFuY2hvcjogbWlkZGxlOyB9CiAgICAgICAgICAuc3ViLWZvY2FsIHsgZmlsbDogIzFkNGVkODsgZm9udDogNTAwIDhweCAnR2Vpc3QgTW9ubycsIG1vbm9zcGFjZTsgdGV4dC1hbmNob3I6IG1pZGRsZTsgfQogICAgICAgICAgLmVkZ2UgeyBmaWxsOiBub25lOyBzdHJva2U6ICM0YzU2NjU7IHN0cm9rZS13aWR0aDogMS4yOyBtYXJrZXItZW5kOiB1cmwoI3B1c2gtZW5jcnlwdGlvbi1hcnJvdyk7IH0KICAgICAgICAgIC5lZGdlLXNlY3VyZSB7IGZpbGw6IG5vbmU7IHN0cm9rZTogIzFkNGVkODsgc3Ryb2tlLXdpZHRoOiAxLjI7IG1hcmtlci1lbmQ6IHVybCgjcHVzaC1lbmNyeXB0aW9uLWFycm93LWFjY2VudCk7IH0KICAgICAgICAgIC5sYWJlbC1tYXNrIHsgZmlsbDogI2YwZWVlOTsgfQogICAgICAgICAgLmxhYmVsIHsgZmlsbDogIzRjNTY2NTsgZm9udDogNTAwIDhweCAnR2Vpc3QgTW9ubycsIG1vbm9zcGFjZTsgbGV0dGVyLXNwYWNpbmc6IC4wNGVtOyB0ZXh0LWFuY2hvcjogbWlkZGxlOyB9CiAgICAgICAgICAubGFiZWwtc2VjdXJlIHsgZmlsbDogIzFkNGVkODsgZm9udDogNTAwIDhweCAnR2Vpc3QgTW9ubycsIG1vbm9zcGFjZTsgbGV0dGVyLXNwYWNpbmc6IC4wNGVtOyB0ZXh0LWFuY2hvcjogbWlkZGxlOyB9CiAgICAgICAgICAubGVnZW5kLXRpdGxlIHsgZmlsbDogIzZhNzI4MjsgZm9udDogNTAwIDhweCAnR2Vpc3QgTW9ubycsIG1vbm9zcGFjZTsgbGV0dGVyLXNwYWNpbmc6IC4xNmVtOyB9CiAgICAgICAgICAubGVnZW5kLXRleHQgeyBmaWxsOiAjNGM1NjY1OyBmb250OiA0MDAgOHB4ICdHZWlzdCBNb25vJywgbW9ub3NwYWNlOyB9CiAgICAgICAgPC9zdHlsZT4KICAgICAgICA8bWFya2VyIGlkPSJwdXNoLWVuY3J5cHRpb24tYXJyb3ciIG1hcmtlcldpZHRoPSI4IiBtYXJrZXJIZWlnaHQ9IjYiIHJlZlg9IjciIHJlZlk9IjMiIG9yaWVudD0iYXV0byI+CiAgICAgICAgICA8cG9seWdvbiBwb2ludHM9IjAgMCw4IDMsMCA2IiBmaWxsPSIjNGM1NjY1Ii8+CiAgICAgICAgPC9tYXJrZXI+CiAgICAgICAgPG1hcmtlciBpZD0icHVzaC1lbmNyeXB0aW9uLWFycm93LWFjY2VudCIgbWFya2VyV2lkdGg9IjgiIG1hcmtlckhlaWdodD0iNiIgcmVmWD0iNyIgcmVmWT0iMyIgb3JpZW50PSJhdXRvIj4KICAgICAgICAgIDxwb2x5Z29uIHBvaW50cz0iMCAwLDggMywwIDYiIGZpbGw9IiMxZDRlZDgiLz4KICAgICAgICA8L21hcmtlcj4KICAgICAgICA8bWFya2VyIGlkPSJwdXNoLWVuY3J5cHRpb24tYXJyb3ctbGluayIgbWFya2VyV2lkdGg9IjgiIG1hcmtlckhlaWdodD0iNiIgcmVmWD0iNyIgcmVmWT0iMyIgb3JpZW50PSJhdXRvIj4KICAgICAgICAgIDxwb2x5Z29uIHBvaW50cz0iMCAwLDggMywwIDYiIGZpbGw9IiMxZDRlZDgiLz4KICAgICAgICA8L21hcmtlcj4KICAgICAgPC9kZWZzPgoKICAgICAgPHJlY3Qgd2lkdGg9IjEyODAiIGhlaWdodD0iNzIwIiBmaWxsPSIjZjBlZWU5Ii8+CgogICAgICA8dGV4dCBjbGFzcz0iZXllYnJvdyIgeD0iNDAiIHk9IjQ4Ij5BUkNISVRFQ1RVUkUgwrcgUEktQkFSSzwvdGV4dD4KICAgICAgPHRleHQgY2xhc3M9ImhlYWRpbmciIHg9IjQwIiB5PSI4NCI+T25lIGVuY3J5cHRpb24gcGF0aCBmb3IgZXZlcnkgQmFyayBwdXNoPC90ZXh0PgogICAgICA8dGV4dCBjbGFzcz0iaW50cm8iIHg9IjQwIiB5PSIxMTIiPkEgY29uZmlndXJlZCBrZXkgYXBwbGllcyB0byBtYW51YWwgb3V0cHV0IGFuZCBhdXRvbWF0aWMgc3RhdHVzIG5vdGlmaWNhdGlvbnMuPC90ZXh0PgoKICAgICAgPCEtLSBMb2NhbCB0cnVzdCB6b25lIGFuZCBlbmNyeXB0ZWQgdHJhbnNwb3J0IGJvdW5kYXJ5IC0tPgogICAgICA8cmVjdCBjbGFzcz0iem9uZSIgeD0iNDAiIHk9IjE1MiIgd2lkdGg9IjgxNiIgaGVpZ2h0PSI0MTYiIHJ4PSI4Ii8+CiAgICAgIDxyZWN0IGNsYXNzPSJsYWJlbC1tYXNrIiB4PSI1MiIgeT0iMTU2IiB3aWR0aD0iODAiIGhlaWdodD0iMTYiIHJ4PSIyIi8+CiAgICAgIDx0ZXh0IGNsYXNzPSJ6b25lLWxhYmVsIiB4PSI2MCIgeT0iMTY4Ij5MT0NBTCBQSTwvdGV4dD4KCiAgICAgIDxsaW5lIGNsYXNzPSJib3VuZGFyeSIgeDE9Ijg4MCIgeTE9IjE3NiIgeDI9Ijg4MCIgeTI9IjU0NCIvPgogICAgICA8cmVjdCBjbGFzcz0ibGFiZWwtbWFzayIgeD0iODkyIiB5PSIxODAiIHdpZHRoPSIyNDAiIGhlaWdodD0iMTYiIHJ4PSIyIi8+CiAgICAgIDx0ZXh0IGNsYXNzPSJib3VuZGFyeS1sYWJlbCIgeD0iOTAwIiB5PSIxOTIiPkNJUEhFUlRFWFQgTEVBVkVTIFBJPC90ZXh0PgoKICAgICAgPCEtLSBDb25uZWN0b3JzIGFyZSBkcmF3biBiZWZvcmUgbm9kZXMgLS0+CiAgICAgIDxwYXRoIGNsYXNzPSJlZGdlIiBkPSJNMjUyIDI0OCBIMjkyIFEzMDAgMjQ4IDMwMCAyNTYgVjMwOCBRMzAwIDMxNiAzMDggMzE2IEgzNTIiLz4KICAgICAgPHBhdGggY2xhc3M9ImVkZ2UiIGQ9Ik0yNTIgNDAwIEgzMDQgUTMxMiA0MDAgMzEyIDM5MiBWMzcyIFEzMTIgMzY0IDMyMCAzNjQgSDM1MiIvPgogICAgICA8bGluZSBjbGFzcz0iZWRnZSIgeDE9IjQ1MiIgeTE9IjQ1MiIgeDI9IjQ1MiIgeTI9IjM5NiIvPgogICAgICA8bGluZSBjbGFzcz0iZWRnZS1zZWN1cmUiIHgxPSI1NTIiIHkxPSIzNDAiIHgyPSI2NDgiIHkyPSIzNDAiLz4KICAgICAgPGxpbmUgY2xhc3M9ImVkZ2Utc2VjdXJlIiB4MT0iODQ4IiB5MT0iMzQwIiB4Mj0iOTIwIiB5Mj0iMzQwIi8+CiAgICAgIDxsaW5lIGNsYXNzPSJlZGdlLXNlY3VyZSIgeDE9IjEwNjAiIHkxPSIzNDAiIHgyPSIxMTAwIiB5Mj0iMzQwIi8+CgogICAgICA8IS0tIENvbm5lY3RvciBsYWJlbHMgLS0+CiAgICAgIDxyZWN0IGNsYXNzPSJsYWJlbC1tYXNrIiB4PSI0NjQiIHk9IjQxNiIgd2lkdGg9IjcyIiBoZWlnaHQ9IjEyIiByeD0iMiIvPgogICAgICA8dGV4dCBjbGFzcz0ibGFiZWwiIHg9IjUwMCIgeT0iNDI0Ij5MT0FEIEVBQ0ggUFVTSDwvdGV4dD4KCiAgICAgIDxyZWN0IGNsYXNzPSJsYWJlbC1tYXNrIiB4PSI1NjgiIHk9IjMyMCIgd2lkdGg9IjY0IiBoZWlnaHQ9IjEyIiByeD0iMiIvPgogICAgICA8dGV4dCBjbGFzcz0ibGFiZWwtc2VjdXJlIiB4PSI2MDAiIHk9IjMyOCI+S0VZIFBSRVNFTlQ8L3RleHQ+CgogICAgICA8cmVjdCBjbGFzcz0ibGFiZWwtbWFzayIgeD0iODU2IiB5PSIzMjAiIHdpZHRoPSI1NiIgaGVpZ2h0PSIxMiIgcng9IjIiLz4KICAgICAgPHRleHQgY2xhc3M9ImxhYmVsLXNlY3VyZSIgeD0iODg0IiB5PSIzMjgiPlBPU1QgL1BVU0g8L3RleHQ+CgogICAgICA8IS0tIE9wYXF1ZSBub2RlIG1hc2tzIC0tPgogICAgICA8cmVjdCBjbGFzcz0ibm9kZS1tYXNrIiB4PSI3MiIgeT0iMjA4IiB3aWR0aD0iMTgwIiBoZWlnaHQ9IjgwIiByeD0iNiIvPgogICAgICA8cmVjdCBjbGFzcz0ibm9kZS1tYXNrIiB4PSI3MiIgeT0iMzYwIiB3aWR0aD0iMTgwIiBoZWlnaHQ9IjgwIiByeD0iNiIvPgogICAgICA8cmVjdCBjbGFzcz0ibm9kZS1tYXNrIiB4PSIzNTIiIHk9IjI4NCIgd2lkdGg9IjIwMCIgaGVpZ2h0PSIxMTIiIHJ4PSI2Ii8+CiAgICAgIDxyZWN0IGNsYXNzPSJub2RlLW1hc2siIHg9IjM1MiIgeT0iNDUyIiB3aWR0aD0iMjAwIiBoZWlnaHQ9IjgwIiByeD0iNiIvPgogICAgICA8cmVjdCBjbGFzcz0ibm9kZS1tYXNrIiB4PSI2NDgiIHk9IjI4NCIgd2lkdGg9IjIwMCIgaGVpZ2h0PSIxMTIiIHJ4PSI2Ii8+CiAgICAgIDxyZWN0IGNsYXNzPSJub2RlLW1hc2siIHg9IjkyMCIgeT0iMjg0IiB3aWR0aD0iMTQwIiBoZWlnaHQ9IjExMiIgcng9IjYiLz4KICAgICAgPHJlY3QgY2xhc3M9Im5vZGUtbWFzayIgeD0iMTEwMCIgeT0iMjg0IiB3aWR0aD0iMTQwIiBoZWlnaHQ9IjExMiIgcng9IjYiLz4KCiAgICAgIDwhLS0gSW5wdXRzIC0tPgogICAgICA8cmVjdCBjbGFzcz0ibm9kZS1pbnB1dCIgeD0iNzIiIHk9IjIwOCIgd2lkdGg9IjE4MCIgaGVpZ2h0PSI4MCIgcng9IjYiLz4KICAgICAgPHJlY3QgY2xhc3M9InRhZyIgeD0iODQiIHk9IjIyMCIgd2lkdGg9IjU2IiBoZWlnaHQ9IjE2IiByeD0iMiIvPgogICAgICA8dGV4dCBjbGFzcz0idGFnLXRleHQiIHg9IjExMiIgeT0iMjMyIj5DT01NQU5EPC90ZXh0PgogICAgICA8dGV4dCBjbGFzcz0ibmFtZSIgeD0iMTYyIiB5PSIyNTYiPi9jb3B5YjwvdGV4dD4KICAgICAgPHRleHQgY2xhc3M9InN1YiIgeD0iMTYyIiB5PSIyNzYiPkxBU1QgQUdFTlQgTUVTU0FHRTwvdGV4dD4KCiAgICAgIDxyZWN0IGNsYXNzPSJub2RlLWlucHV0IiB4PSI3MiIgeT0iMzYwIiB3aWR0aD0iMTgwIiBoZWlnaHQ9IjgwIiByeD0iNiIvPgogICAgICA8cmVjdCBjbGFzcz0idGFnIiB4PSI4NCIgeT0iMzcyIiB3aWR0aD0iNDgiIGhlaWdodD0iMTYiIHJ4PSIyIi8+CiAgICAgIDx0ZXh0IGNsYXNzPSJ0YWctdGV4dCIgeD0iMTA4IiB5PSIzODQiPkVWRU5UPC90ZXh0PgogICAgICA8dGV4dCBjbGFzcz0ibmFtZSIgeD0iMTYyIiB5PSI0MDgiPlBpIHN0YXR1czwvdGV4dD4KICAgICAgPHRleHQgY2xhc3M9InN1YiIgeD0iMTYyIiB5PSI0MjgiPk5FRURTIElOUFVUIMK3IEZJTklTSEVEPC90ZXh0PgoKICAgICAgPCEtLSBTaGFyZWQgc2VuZGVyIGFuZCBjb25maWcgLS0+CiAgICAgIDxyZWN0IGNsYXNzPSJub2RlIiB4PSIzNTIiIHk9IjI4NCIgd2lkdGg9IjIwMCIgaGVpZ2h0PSIxMTIiIHJ4PSI2Ii8+CiAgICAgIDxyZWN0IGNsYXNzPSJ0YWciIHg9IjM2NCIgeT0iMjk2IiB3aWR0aD0iNDgiIGhlaWdodD0iMTYiIHJ4PSIyIi8+CiAgICAgIDx0ZXh0IGNsYXNzPSJ0YWctdGV4dCIgeD0iMzg4IiB5PSIzMDgiPlNIQVJFRDwvdGV4dD4KICAgICAgPHRleHQgY2xhc3M9Im5hbWUiIHg9IjQ1MiIgeT0iMzQwIj5QdXNoIHNlbmRlcjwvdGV4dD4KICAgICAgPHRleHQgY2xhc3M9InN1YiIgeD0iNDUyIiB5PSIzNjQiPk9ORSBQQVRIIEZPUiBFVkVSWSBQVVNIPC90ZXh0PgogICAgICA8dGV4dCBjbGFzcz0ic3ViIiB4PSI0NTIiIHk9IjM4MCI+REVWSUNFIEtFWSArIENPTlRFTlQ8L3RleHQ+CgogICAgICA8cmVjdCBjbGFzcz0ibm9kZS1zdG9yZSIgeD0iMzUyIiB5PSI0NTIiIHdpZHRoPSIyMDAiIGhlaWdodD0iODAiIHJ4PSI2Ii8+CiAgICAgIDxyZWN0IGNsYXNzPSJ0YWciIHg9IjM2NCIgeT0iNDY0IiB3aWR0aD0iNDgiIGhlaWdodD0iMTYiIHJ4PSIyIi8+CiAgICAgIDx0ZXh0IGNsYXNzPSJ0YWctdGV4dCIgeD0iMzg4IiB5PSI0NzYiPkNPTkZJRzwvdGV4dD4KICAgICAgPHRleHQgY2xhc3M9Im5hbWUiIHg9IjQ1MiIgeT0iNTAwIj5waS1iYXJrIGNvbmZpZzwvdGV4dD4KICAgICAgPHRleHQgY2xhc3M9InN1YiIgeD0iNDUyIiB5PSI1MjAiPkRFVklDRSBLRVkgwrcgQ1VTVE9NIEtFWTwvdGV4dD4KCiAgICAgIDwhLS0gRW5jcnlwdGlvbiBmb2NhbCBwb2ludCAtLT4KICAgICAgPHJlY3QgY2xhc3M9Im5vZGUtZm9jYWwiIHg9IjY0OCIgeT0iMjg0IiB3aWR0aD0iMjAwIiBoZWlnaHQ9IjExMiIgcng9IjYiLz4KICAgICAgPHJlY3QgY2xhc3M9InRhZy1mb2NhbCIgeD0iNjYwIiB5PSIyOTYiIHdpZHRoPSI1NiIgaGVpZ2h0PSIxNiIgcng9IjIiLz4KICAgICAgPHRleHQgY2xhc3M9InRhZy10ZXh0LWZvY2FsIiB4PSI2ODgiIHk9IjMwOCI+RU5DUllQVDwvdGV4dD4KICAgICAgPHRleHQgY2xhc3M9Im5hbWUiIHg9Ijc0OCIgeT0iMzQwIj5BRVMyNTYtR0NNPC90ZXh0PgogICAgICA8dGV4dCBjbGFzcz0ic3ViLWZvY2FsIiB4PSI3NDgiIHk9IjM2NCI+RlJFU0ggMTItQllURSBJVjwvdGV4dD4KICAgICAgPHRleHQgY2xhc3M9InN1Yi1mb2NhbCIgeD0iNzQ4IiB5PSIzODAiPkFVVEggVEFHIEFQUEVOREVEPC90ZXh0PgoKICAgICAgPCEtLSBFeHRlcm5hbCBkZWxpdmVyeSAtLT4KICAgICAgPHJlY3QgY2xhc3M9Im5vZGUtZXh0ZXJuYWwiIHg9IjkyMCIgeT0iMjg0IiB3aWR0aD0iMTQwIiBoZWlnaHQ9IjExMiIgcng9IjYiLz4KICAgICAgPHJlY3QgY2xhc3M9InRhZyIgeD0iOTMyIiB5PSIyOTYiIHdpZHRoPSI0OCIgaGVpZ2h0PSIxNiIgcng9IjIiLz4KICAgICAgPHRleHQgY2xhc3M9InRhZy10ZXh0IiB4PSI5NTYiIHk9IjMwOCI+U0VSVkVSPC90ZXh0PgogICAgICA8dGV4dCBjbGFzcz0ibmFtZSIgeD0iOTkwIiB5PSIzNDAiPkJhcmsgc2VydmVyPC90ZXh0PgogICAgICA8dGV4dCBjbGFzcz0ic3ViIiB4PSI5OTAiIHk9IjM2NCI+Rk9SV0FSRFMgT05MWTwvdGV4dD4KICAgICAgPHRleHQgY2xhc3M9InN1YiIgeD0iOTkwIiB5PSIzODAiPkNBTk5PVCBSRUFEIENPTlRFTlQ8L3RleHQ+CgogICAgICA8cmVjdCBjbGFzcz0ibm9kZSIgeD0iMTEwMCIgeT0iMjg0IiB3aWR0aD0iMTQwIiBoZWlnaHQ9IjExMiIgcng9IjYiLz4KICAgICAgPHJlY3QgY2xhc3M9InRhZyIgeD0iMTExMiIgeT0iMjk2IiB3aWR0aD0iMzIiIGhlaWdodD0iMTYiIHJ4PSIyIi8+CiAgICAgIDx0ZXh0IGNsYXNzPSJ0YWctdGV4dCIgeD0iMTEyOCIgeT0iMzA4Ij5BUFA8L3RleHQ+CiAgICAgIDx0ZXh0IGNsYXNzPSJuYW1lIiB4PSIxMTcwIiB5PSIzNDAiPkJhcmsgQXBwPC90ZXh0PgogICAgICA8dGV4dCBjbGFzcz0ic3ViIiB4PSIxMTcwIiB5PSIzNjQiPk1BVENISU5HIDMyLUJZVEUgS0VZPC90ZXh0PgogICAgICA8dGV4dCBjbGFzcz0ic3ViIiB4PSIxMTcwIiB5PSIzODAiPkRFQ1JZUFRTIExPQ0FMTFk8L3RleHQ+CgogICAgICA8IS0tIExlZ2VuZCAtLT4KICAgICAgPGxpbmUgeDE9IjQwIiB5MT0iNjE2IiB4Mj0iMTI0MCIgeTI9IjYxNiIgc3Ryb2tlPSIjMTAxODI4IiBzdHJva2Utb3BhY2l0eT0iLjE0IiBzdHJva2Utd2lkdGg9Ii44Ii8+CiAgICAgIDx0ZXh0IGNsYXNzPSJsZWdlbmQtdGl0bGUiIHg9IjQwIiB5PSI2NTIiPkxFR0VORDwvdGV4dD4KICAgICAgPGxpbmUgeDE9IjE0NCIgeTE9IjY0OCIgeDI9IjE4NCIgeTI9IjY0OCIgc3Ryb2tlPSIjNGM1NjY1IiBzdHJva2Utd2lkdGg9IjEuMiIgbWFya2VyLWVuZD0idXJsKCNwdXNoLWVuY3J5cHRpb24tYXJyb3cpIi8+CiAgICAgIDx0ZXh0IGNsYXNzPSJsZWdlbmQtdGV4dCIgeD0iMTk2IiB5PSI2NTIiPkxPQ0FMIENPTlRFTlQ8L3RleHQ+CiAgICAgIDxsaW5lIHgxPSIzNDQiIHkxPSI2NDgiIHgyPSIzODQiIHkyPSI2NDgiIHN0cm9rZT0iIzFkNGVkOCIgc3Ryb2tlLXdpZHRoPSIxLjIiIG1hcmtlci1lbmQ9InVybCgjcHVzaC1lbmNyeXB0aW9uLWFycm93LWFjY2VudCkiLz4KICAgICAgPHRleHQgY2xhc3M9ImxlZ2VuZC10ZXh0IiB4PSIzOTYiIHk9IjY1MiI+RU5DUllQVEVEIENPTlRFTlQ8L3RleHQ+CiAgICAgIDxyZWN0IHg9IjU2OCIgeT0iNjQwIiB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHJ4PSI0IiBmaWxsPSIjMWQ0ZWQ4IiBmaWxsLW9wYWNpdHk9Ii4wOCIgc3Ryb2tlPSIjMWQ0ZWQ4IiBzdHJva2Utd2lkdGg9IjEiLz4KICAgICAgPHRleHQgY2xhc3M9ImxlZ2VuZC10ZXh0IiB4PSI1OTYiIHk9IjY1MiI+RU5DUllQVElPTiBCT1VOREFSWTwvdGV4dD4KICAgIDwvc3ZnPgo=)

## Config

Package-owned: `~/.pi/agent/config/pi-bark/config.json`

| Name | Description | Values | Default |
| --- | --- | --- | --- |
| `serverUrl` | Base URL of the Bark server that accepts push requests. | HTTP or HTTPS URL with an optional path and no query or fragment. | `"https://api.day.app"` |
| `deviceKey` | Identifies the Bark App installation that receives the push notification. | Non-empty string or `null`. | `null` |
| `encryption` | Custom Encryption Key and matching Bark encryption settings. | AES256-GCM settings object or `null`. | `null` |
| `statusNotifications` | Controls automatic status notifications by CWD. | Global boolean default and absolute-CWD boolean overrides. | Enabled with no overrides. |

### Push encryption

Push encryption is optional. It prevents the Bark server and Apple Push Notification service from reading push content.

Once configured, pi-bark encrypts every push it sends. This includes `/copyb` and both automatic status notifications.

#### Set up encryption

1. Configure your Bark Device Key with `/set-bark`.
2. Generate and save a Custom Encryption Key:

   ```bash
   npx --yes --package=@henryqw/pi-bark -- pi-bark-key
   ```

   `npx` temporarily downloads the package and runs its `pi-bark-key` executable. The command saves the key to pi-bark's config and prints it once.

3. Open **Bark App → Push Encryption**.
4. Enter these settings:

   | Setting | Value |
   | --- | --- |
   | Algorithm | `AES256` |
   | Mode | `GCM` |
   | Padding | `noPadding` |
   | Key | The generated 32-character key |

   The generated ASCII key is 32 characters and 32 bytes.

5. If Bark requires an IV, enter any 12 ASCII characters, such as `000000000000`.
6. Save the Bark settings.
7. Run `/copyb` in Pi. Bark should show the exact last agent message instead of `Decryption Failed`.

The saved IV is only a placeholder for older Bark versions. pi-bark creates a fresh 12-byte IV for each push and sends it with the ciphertext. Bark uses that per-push IV instead of the saved value.

Do not paste the command output into shared logs. The Custom Encryption Key can decrypt your push content.

The GCM authentication tag is appended to the ciphertext before Base64 encoding, as Bark requires.

#### Replace or disable the key

The command refuses to overwrite an existing key. Replace it only when you also update the Bark App:

```bash
npx --yes --package=@henryqw/pi-bark -- pi-bark-key --force
```

Disable push encryption in pi-bark with:

```bash
npx --yes --package=@henryqw/pi-bark -- pi-bark-key --disable
```

Disable Push Encryption in the Bark App too. Otherwise its settings no longer match pi-bark.

The config file has this shape:

```json
{
  "serverUrl": "https://api.day.app",
  "deviceKey": "your-device-key",
  "encryption": {
    "algorithm": "AES256",
    "mode": "GCM",
    "padding": "noPadding",
    "key": "your-32-character-custom-key"
  },
  "statusNotifications": {
    "defaultEnabled": true,
    "cwdOverrides": {
      "/srv/quiet-project": false
    }
  }
}
```

Set `encryption` to `null` when push encryption is disabled.

- A missing config stays missing until a command or the key script writes it.
- `/set-bark` preserves Push Encryption and status notification settings.
- The server URL must use HTTP or HTTPS. It cannot contain a query or fragment delimiter.
- Config writes are private and atomic.
- Pi commands never print the Device Key, server URL, or Custom Encryption Key.

## Limits and recovery

Bark and Apple Push Notification service limit notification payload sizes. This extension does not truncate push content. Bark returns an error when a message is too large.

`/copyb` waits up to 15 seconds for the Bark server. If the push request fails after the clipboard copy, your clipboard still contains the message.

Invalid config files cause a visible error and remain unchanged. Fix or move the malformed file, then retry the command.

See Bark's [Push Encryption documentation](https://github.com/Finb/Bark/blob/master/docs/en-us/encryption.md) for the encryption model.
