Platform support
What exists today, what is being built, and what is not planned.
Written to be honest rather than encouraging. If your platform is not here, the copilot does not run on it yet, and no amount of reading further will change that.
SDKs
| Platform | Status | Notes |
|---|---|---|
| Flutter (iOS, Android) | Shipping (0.34.0) | The reference implementation. Every component in the catalog is drawn natively; nothing is a web view. |
| Swift / SwiftUI | Not started | The protocol is language-neutral and the catalog is documented block by block, so a native client is a real project rather than a port. Talk to us if you need one. |
| Kotlin / Jetpack Compose | Not started | As above. |
| React Native | Not started | — |
| Web | Shipping (0.11.0) | One script tag, for any site. Every component in the catalog, drawn in the page with its own isolated styles. |
Flutter
| Requirement | Version |
|---|---|
| Flutter | 3.24 or newer |
| Dart | 3.5 or newer |
| iOS deployment target | 13.0 |
Android minSdkVersion | 24 |
The package is a Flutter plugin, and it brings plugins with it: image_picker and speech_to_text for the composer's "+" and microphone, url_launcher for a card's link, and shared_preferences to keep the device id and the published look between launches. Besides those, http and crypto. Its own native code is two small files: the Android manifest that declares the microphone and network permissions, and an iOS check that hides the microphone and the camera when Info.plist lacks their usage strings, instead of letting iOS close the app. The install page has the three Info.plist lines that are yours to write.
Where it keeps things
Two things are kept on the device, in the app's preferences, unless you say otherwise; each takes one small class to move:
- Remote config across launches —
RendelConfig.configStore - A device id across launches —
RendelConfig.deviceIdStore
Server
Nothing to install. The API is hosted; your app talks to it directly over HTTPS. There is no on-premise deployment and no self-hosted option today.
Data is processed in eu-central-1 (Frankfurt). See the security summary for what is stored and for how long.
Locales
The protocol carries client.locale, and the SDK sends the device's own — unless you set one, which you should as soon as your app has a language picker. A phone set to English running a Turkish app should not make the copilot the one English thing on the screen.
RendelConfig(locale: 'tr-TR')The answer. The server asks the model for that language, and the request is a default rather than a rule: a message written in another language is answered in that one. Somebody typing English into a Turkish app has said more about what they want to read than a setting has.
The confirmation sentence. The card is built by the server on purpose: a card the model words is a card the model can word into something the user did not agree to. So the sentence comes from your template, and RendelAction.confirmTemplates gives that template a translation per locale.
RendelAction(
name: 'cancel_order',
description: 'Cancel an order that has not shipped',
params: RendelSchema.object({'order_id': RendelSchema.string()}),
risk: RendelRisk.destructive,
confirmTemplate: 'Cancel order {order_id}? This cannot be undone.',
confirmTemplates: {
'tr': '{order_id} numaralı siparişi iptal edelim mi? Bu geri alınamaz.',
'de': 'Bestellung {order_id} stornieren? Das kann nicht rückgängig gemacht werden.',
},
handler: cancelOrder,
)Matched on the locale the SDK sends: the exact tag first (pt-BR), then the language (pt), then a regional variant of that language if one is offered, then confirmTemplate. An action with no template at all falls back to a sentence generated from its own name, which is English — so an app serving another language should set one.
The SDK's own words — the two buttons on a confirmation card, the working row, the error bar — follow the same locale, with no second setting. The SDK ships them in Türkçe, Deutsch, Français, Español and العربية; any other language keeps the English ones. So an app that sets locale: 'tr-TR' no longer answers in Turkish and then offers "Confirm" underneath it.
Take them over by setting RendelConfig.strings, which then wins whole — including staying English in an app whose locale says otherwise. To change one word without giving up the rest, start from the shipped set:
RendelConfig(
locale: 'tr-TR',
strings: RendelStrings.forLocale('tr').copyWith(confirm: 'Transferi onayla'),
)Deliberately not a Localizations delegate: you already tell us your language in locale, and asking you to register a delegate on top of that would be a worse trade than reading the field.
The shipped translations were written by the engineer who built the feature, not by a translator. confirm, goBack and irreversible sit on a destructive action's authorisation, where a word that means nearly the right thing is a consent problem rather than a typo — have a native speaker read those three before you go live in that language, and copyWith over them until they have.
Still English and not yet configurable: nothing in the catalog, because every word in a rendered block comes from the model or from your own data. The console's own pages are English throughout — it is the surface your developers use, not your users'.
You can try all of this before you build: the Test page in the console has a device-language picker, sends the locale a device would send, and previews the copilot's own words in it.