Smarter chat, on device.
Hide personal data before a message is sent, flag abuse before it's posted, suggest emoji as people type, and transcribe voice notes, all on device.
AI models built for chat
Works in end-to-end encrypted chats
Every model runs on device: on a message before it's encrypted, or after it's decrypted. Your servers never see the text, so you add the feature without weakening encryption or running anything new.
No per-call cost
Check every message people send and receive, with no bill per message and no infrastructure to run. Your product team can add a feature without first forecasting cloud spend.
Faster than typing
Emo suggests emoji in under 2ms, so the suggestions change with every key. Tongue names the language of an incoming message in tens of microseconds.
Examples
Each example replays real output from the models. Open a model page to try it on your own text.
Redact · PII redaction
Warn before someone shares a bank or ID number
Redact finds Social Security numbers, card numbers, IBANs and phone numbers in the message box as someone types. Card numbers and IBANs must pass a checksum, so those warnings are reliable. Free-form names and addresses are where Redact misses most.
Toxic · Hate speech triage · Beta
A second look before a hurtful message is posted
Toxic scores each message for hate, abuse and threats before it's posted, in 35 languages. When a score is high, offer the sender a moment to rewrite. Toxic is a triage aid, so send what it flags to a person, not straight to removal.
Moderator · Content moderation
Pixelate an unwanted image before anyone sees it
Moderator checks each photo on the sender's device, so no image goes to a server to be checked, even in an end-to-end encrypted chat. A nude arrives pixelated, and the person chooses to view it or report it.
Emo · Emoji suggestions
Emoji that follow the message
Emo updates the suggestions on every keystroke: 🍕 for a team pizza night, 🎂 for a birthday in Spanish, 🦷 for a dentist appointment in French.
Tongue · Language identification
Offer a translation from the first few words
Tongue names the language of an incoming message from a few words, so a Translate button shows up only on the messages that need one. The translation itself comes from your own translation service.
Voz · Speech recognition
Read a voice note instead of playing it
Voz transcribes a voice message with a time on every word, so the text shows up under the waveform and follows along as it plays. Voz covers 25 European languages, so pair it with Ear to name the language first.
Get started
Install the models you need from one SDK, in Swift, Kotlin or JavaScript. The example checks each outgoing message with Toxic and Redact.
iOS, macOS, Linux, Windows
// Swift Package Manager
.package(url: "https://github.com/Desert-Ant-Labs/desert-ant-core", from: "4.3.0")
// target dependencies
.product(name: "Redact", package: "desert-ant-core")
.product(name: "Toxic", package: "desert-ant-core")
.product(name: "Emo", package: "desert-ant-core")
.product(name: "Tongue", package: "desert-ant-core")
import Redact
import Toxic
let redact = Redact()
let toxic = Toxic()
// before a message is sent
let check = try await toxic.analyze(message)
if check.isToxic { askToRewrite(check.content) }
let r = try await redact.redaction(of: message)
if !r.items.isEmpty { offerToMask(r.items) }
Android
// build.gradle.kts (Maven Central)
implementation("ai.desertant:redact:4.3.0")
implementation("ai.desertant:toxic:4.3.0")
implementation("ai.desertant:emo:4.3.0")
implementation("ai.desertant:tongue:4.3.0")
import ai.desertant.redact.Redact
import ai.desertant.toxic.Toxic
val redact = Redact(context)
val toxic = Toxic(context)
// before a message is sent
val check = toxic.analyze(message)
if (check.isToxic) askToRewrite(check.content)
val r = redact.redaction(message)
if (r.redactedText != message) offerToMask(r)
Web, Node.js
npm i @desert-ant-labs/redact @desert-ant-labs/toxic @desert-ant-labs/emo @desert-ant-labs/tongue @litertjs/core
import { Redact } from "@desert-ant-labs/redact";
import { Toxic } from "@desert-ant-labs/toxic";
const redact = await Redact.load();
const toxic = await Toxic.load();
// before a message is sent
const check = await toxic.analyze(message);
if (check.isToxic) askToRewrite(check.content);
const r = await redact.redaction(message);
if (r.items.length) offerToMask(r.items);
Building a chat product?
Tell us what you want to add for your users, and we'll help you pick the models and plan the integration.






