---
title: Emoji and GIFs in SMS
---
# Emoji and GIFs in SMS

## What it is

The SMS composer has two extra buttons next to the picture button — an **emoji
picker** and a **GIF picker** — in both the **New SMS** box and the reply box
inside a conversation.

- **Emoji** — opens a searchable panel (with a "Recent" row of your go-to emoji);
  tap one and it drops into your message right where the cursor is.
- **GIF** — opens GIF search powered by **Klipy** (a free GIF service used by apps
  like WhatsApp and Discord); trending GIFs show when you open it, type to search,
  tap one to attach it. The GIF
  sends as a **picture message from your own number**, animated wherever the
  recipient's phone/carrier shows animation.

> **Sending GIFs needs the Pushbullet provider.** A GIF goes out as a picture (MMS),
> so it works only on **Pushbullet**; the native (self-hosted phone) provider is
> **text-only for now**. Emoji work on either provider.

## Where to find it

In the SMS panel — the **New SMS** box or any conversation's reply box — the emoji and GIF buttons sit next to the picture button.

## How it behaves

### How to use it

In the SMS panel — **New SMS** (pencil) or a conversation's reply box:

1. Click the **smiley button** to add emoji, or the **GIF button** to search GIFs.
2. For a GIF, tap the one you want — it attaches as the picture for your next text
   (you can still add words). A thumbnail preview appears; remove it with the × if
   you change your mind.
3. Press **Send**. The GIF goes out attached to your text, just like sending a
   photo.

Works on **desktop and mobile**.

### Do I need to set anything up?

For GIFs, yes — GIF search needs a free **Klipy** key. Grab one from klipy.com and
paste it in **Settings → SMS → "GIF search key (Klipy)"**. Emoji need no setup.
Until a key is added, tapping **GIF** shows a short "GIF search isn't set up yet" note.

### Cost / heads-up

GIF search itself is free. A GIF you send is a **picture message**, so it counts
against your **Pushbullet** texting allowance the same as any MMS, and animation
depends on the recipient's phone/carrier (some show a still frame). Sending a GIF
**you** receive is not supported — Pushbullet's bridge can't receive picture
messages at all.

## For agents

### Under the hood (for agents)

- One shared `SmsComposerExtraTools` (emoji + GIF buttons) drops into the
  `MessageBarToolZone` of both SMS compose surfaces.
- Emoji = a curated ~400-emoji zero-dependency dataset + a localStorage "Recent"
  row; selecting one calls the composer's `insertAtCursor`.
- GIF search + the GIF byte fetch run in **Main** (`klipy-service.ts`) so
  the key never crosses IPC. The chosen GIF is fetched into a bounded
  `data:image/gif` URL and staged **un-downscaled** (`stageRawDataUrl`) so its
  animation survives the existing MMS send path.
- The GIF download is SSRF-gated: https + a Klipy-media-host allow-list before any
  fetch, `content-type: image/gif` required, and a byte cap under the send gate.
- Full invariants: `.claude/memory/contracts/sms-emoji-gif-picker-contract.md`
  (the GIF-as-picture send path is `.claude/memory/contracts/sms-mms-pictures-contract.md`).

## Related

Sending pictures in SMS is the sibling capability in the same composer, and scheduling a text is the third control that sits beside them.
