Emo: On-device Emoji Suggestions
On-device emoji suggestions that read a short piece of text and return the emoji that actually fit it, in 23 languages, in under 10 milliseconds.
Emo predicts relevant emoji from short text like tasks, calendar entries, and messages. "Dentist appointment" returns 馃Ψ 馃 馃彞 馃┖; "Pay my bills" returns 馃挵 馃挸 馃Ь. It is tuned for how people actually write, and it supports skin-tone variants.
Emo suggests emoji from meaning; it is not an emoji picker. A picker shows a grid to browse. Emo reads the text and proposes the fitting emoji, the way a predictive keyboard proposes the next word. A compact two-stream text classifier keeps it small and fast enough to run on every keystroke.
Demo
Performance
Sub-10 ms suggestions from a <6 MB model, across 23 languages.
Internal measurements. Emoji semantics are approximate, so near-ties at the top of the ranking are expected.
Use cases
Keyboard and autocomplete
Suggest emoji as the user types, the way a predictive keyboard suggests words, entirely on device.
Calendar and task entries
Tuned for short entries: "Dentist appointment" returns 馃Ψ 馃 馃彞 馃┖, so a scheduling app can label events automatically.
Messaging
Surface fitting emoji for a draft message across languages, with no network round-trip.
Complements a picker
Emo works from meaning, so it sits alongside the emoji grid rather than replacing it.
What it does
- Curated vocabulary of ~800 everyday emoji, with skin-tone variants
- Multilingual: 23 languages, including CJK, Arabic, Thai, and Hindi
- Prediction in under 10 ms on modern phones
- Small bundled model, no server call
Platforms and install
// Swift Package Manager .package(url: "https://github.com/Desert-Ant-Labs/emo-swift", from: "0.5.0")
import Emo let emoji = try await Emo.suggestions(for: "Pay my bills") // ["馃挵", "馃挸", "馃Ь"]
// build.gradle.kts (via JitPack)
implementation("com.github.Desert-Ant-Labs:emo-kotlin:0.5.0")
import ai.desertant.emo.Emo
val emoji = Emo.suggestions("Pay my bills")
// ["馃挵", "馃挸", "馃Ь"]
npm i @desert-ant-labs/emo
import { suggestions } from "@desert-ant-labs/emo";
const results = await suggestions("Pay my bills");
// [{ emoji: "馃挵", confidence: 0.62 }, ...]
Specs
- Languages
- 23, including CJK, Arabic, Thai, and Hindi
- On-device size
- ~5 MB bundled (model + tokenizer)
- Latency
- Under 10 ms per suggestion
- Approach
- Two-stream text classifier: lexical n-grams plus a multilingual embedding