# 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`.