ThinkHearth
For Android 14 and later

ThinkHearth

One AI model.
Every app gathers round.

ThinkHearth keeps a single private AI model on your phone and lets your other apps share it. You download the model once, it runs on the phone itself, and what you type stays on the device.

Why share one model?

On-device AI models are several gigabytes each. When every app ships its own, your storage and memory fill up with copies of the same thing.

Today: one model per app

Each app downloads and loads its own copy.

App A App B App C Model Model Model

With ThinkHearth: one shared model

Apps ask ThinkHearth, which runs the one model for all of them.

App A App B App C ThinkHearth · Model

What it does

A small app that stays in the background and works only when another app asks it to.

Download once

One copy of the model, stored in one place, used by every app that supports ThinkHearth.

Private by design

The model runs entirely on your phone. Prompts and replies are never sent to a server.

You decide who uses it

The first time an app asks to use the model, ThinkHearth asks you to allow it. You can revoke access at any time.

Warm when needed

The model loads when an app needs it and unloads after a quiet spell, freeing memory for everything else.

For app developers

Add on-device AI to your Android app in minutes with the ThinkHearth SDK. There's no model to bundle, no download code to write and no server to run. Your app asks ThinkHearth, and the reply is made on the phone. If ThinkHearth isn't installed, your app can fall back to its own model or hide its AI features.

1 lineto add the SDK
0 MBof model in your app
0permissions to declare
Kotlin & Fluttersupported

Kotlin

1Add the SDK · build.gradle.kts
implementation("com.thinkhearth:client:1.0.0")
2Connect, and ask once
val hearth = ThinkHearthClient.connect(context)
    ?: return useFallback()
if (hearth.accessState() != AccessState.ALLOWED)
    ask.launch(ThinkHearthClient.accessRequestIntent())
3Stream the reply
hearth.generate(GenerateRequest(prompt = "Hello"))
    .collect { if (it is GenerateEvent.Token) append(it.text) }

What the SDK handles for you

  1. Finding ThinkHearth and connecting to it, with nothing to add to your manifest.
  2. Permission: ThinkHearth shows its own approval screen, and the person allows your app once.
  3. Streaming: replies arrive a few words at a time as a Kotlin Flow, and cancelling stops the model straight away.
  4. Your settings, per request: instructions, chat history, photos, temperature, top-K, top-P, reply length and thinking.
  5. Embeddings for search and "find similar", from the same connection.
Flutter
if (!await ThinkHearth.isInstalled()) return useFallback();
if (await ThinkHearth.accessState() != AccessState.allowed &&
    !await ThinkHearth.requestAccess()) return;

await for (final e in ThinkHearth.generate(
    const ThinkHearthRequest(prompt: 'Hello'))) {
  if (e is ThinkHearthToken) append(e.text);
}

Everything your app sends stays on the phone. Each request can only use the model after the person has allowed your app, and they can switch it off at any time.

Privacy

ThinkHearth is designed so that your words stay on your phone.

No cloud

All AI processing happens on the device. Web search in ThinkHearth's own chat is off unless you turn it on.

No accounts

There's nothing to sign up for, and nothing identifies you.

No tracking

No analytics or advertising, and this website doesn't use cookies.