Desert Ant Labs

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.

88.8%Personal data caught
11.6MBOn deviceApple; 24.5MB on Android and the web
27Languages
Redact

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.

35Languages
3Signalshateful, abusive, threatening
102MBOn deviceApple; 103MB on Android and the web
Toxic

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.

87.8%Nudity caught
93.7%Safe photos passed
9.7MBOn deviceApple; 9.2MB on Android and the web
Moderator

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.

<2msPer suggestion
5MBOn deviceApple; 11MB on Android and the web
22Languages
Emo

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.

84Languages
2MBOn deviceinside the package, nothing to download
0.933FLORES-200, 3 words0.887 for a 293MB detector
Tongue

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.

2s10 minutes of audioiPhone 17 Pro
25LanguagesEuropean
337MBOn diskApple, downloaded on first use
Voz

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

Install
// 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")
Example - Swift
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

Install
// 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")
Example - Kotlin
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

Install
npm i @desert-ant-labs/redact @desert-ant-labs/toxic @desert-ant-labs/emo @desert-ant-labs/tongue @litertjs/core
Example - TypeScript
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.