# dsc emoji

Manage custom emoji on a Discourse install.

Requires an admin API key and username.

## dsc emoji pull

```
dsc emoji pull <discourse> <output-dir>
```

Downloads all custom emoji from the instance into `output-dir`. Images are saved as `<name>.<ext>` where the extension is derived from the remote URL. Files that already exist locally are skipped.

## dsc emoji push

```
dsc emoji push <discourse> <emoji-path> [emoji-name]
```

Adds a new emoji from a local image file (alias: `dsc emoji add`). If `emoji-name` is omitted, the filename stem is used, slugified to Discourse's accepted shape (lowercased, hyphens preserved) - so `google-drive.svg` becomes `google-drive`.

If `emoji-path` is a directory, uploads all `.png`, `.jpg`, `.jpeg`, `.gif`, `.svg` files using the filename stem as the emoji name.

If your instance requires a `client_id` query parameter for admin emoji endpoints, set `DSC_EMOJI_CLIENT_ID` to append it automatically.

Bulk uploads retry automatically on HTTP 429 responses, reading the wait time from the `Retry-After` header, the `extras.wait_seconds` JSON field, or the message body.

If you consistently hit rate limits on large batches, raise `DISCOURSE_MAX_ADMIN_API_REQS_PER_MINUTE` (default 60). This is a Discourse global setting, not a site setting — it is not visible in the Admin UI. On a standard Docker install, set it under `env:` in `/var/discourse/containers/app.yml` and rebuild the container. Nginx-level 429s (HTML body, `nginx` in the response) come from the reverse proxy, not Discourse itself, and must be raised in the proxy config.

## dsc emoji list

```
dsc emoji list <discourse> [--format text|json|yaml] [--inline]
```

Lists custom emojis (name + URL).

Flags:

- `--inline` (or `-i`) — render emoji images inline in supported terminals.
  - Override detection with `DSC_EMOJI_INLINE_PROTOCOL=iterm2|kitty|off`.
