DuoDuo docs

How DuoDuo works.

What DuoDuo is, how it learns, and the ways you reach it. Where there is something to do, these pages hand it to your DuoDuo.

Talk to the same DuoDuo from a chat app, another assistant, a room, or your pocket.

Reach

DuoDuo Pocket

Ambient in your pocket: the DuoDuo iPhone app, in TestFlight beta, and accessories such as the push-to-talk Passport.

DuoDuo Pocket is Ambient in your pocket. The DuoDuo app for iPhone is the Ambient channel's app: one conversation with the same DuoDuo that runs on your machine. Type, hold to talk, or send photos and files. Set the phone down in ambient mode and it listens to the room, answering what was said to it.

Accessories reach DuoDuo through the app. The first is the Passport, a card-sized device with a screen and three buttons: hold OK, say what you need, let go, and the phone can stay in your pocket.

Get the app#

The DuoDuo app needs iOS 17 or later and is in TestFlight beta:

Apply for the TestFlight beta

Applications are reviewed, and the TestFlight invitation arrives by email once yours is approved.

The app is source-available, so you can also build it yourself, signed with your own Apple developer team: openduo/pocket-ios has the source and the build steps.

Without a DuoDuo yet, tap Try it first on the app's first screen. It runs on built-in demo content, so you can look around before you set anything up.

What it takes#

PartWhat it is
AmbientThe Ambient channel beside your DuoDuo, and the cerebellum that does its hearing. Everything you say through Pocket takes Ambient's path to DuoDuo.
DuoDuo appAmbient's iPhone app, and the way accessories reach DuoDuo.
Accessories (optional)Hardware that talks to DuoDuo through the app. The first is the Passport: a FoloToy AI Passport running the Pocket firmware, a card-sized device with a screen and three buttons.

Get started#

  1. Set up Ambient. Give your DuoDuo the duoduo-ambient skill and ask it to set up Pocket:

    npx -y skills add https://github.com/openduo/duoduo --skill duoduo-ambient
    

    The skill walks DuoDuo through installing the Ambient channel, connecting it to your cerebellum, creating a room, and publishing that room to your tailnet. You approve each change. The cerebellum, Ambient's backend, and its configurations are covered in Ambient.

  2. Connect the app. On first launch, the app signs in to Tailscale, asks for the host and room of your Ambient channel, and checks the connection live.

  3. Add a Passport (optional). The firmware is published in the AI Passport App Library as DuoDuo Pocket; flash it from the browser with FoloToy's web flasher. The Passport needs no Wi-Fi: it only talks to your phone, over Bluetooth. After flashing, it shows a pairing code. In the app, tap Add Passport, choose DuoDuo Pocket XXXX, tap Pair, and press OK on the Passport.

How it works#

  1. You talk, or the room does. In the app, type or hold to talk; in ambient mode the phone listens to the room. On a Passport, hold OK: it records while the button is down and streams the audio to the phone over an encrypted, bonded Bluetooth LE link.
  2. The phone relays. The app sends it to the Ambient channel on your DuoDuo host, over your own Tailscale network. Nothing is exposed to the public internet.
  3. Ambient decides who was addressed. In ambient mode, Ambient judges whether a sentence was said to DuoDuo, as it does in any room. Holding to talk, on the phone or on a Passport, settles the question: holding the button means you are talking to DuoDuo.
  4. DuoDuo works and answers. The app shows each stage as it happens: received, thinking, looking it up. The answer streams into the conversation, ambient mode speaks it, and a Passport shows the latest reply on its screen, where UP and DOWN page through it.

The phone is the only link between an accessory and your host. If the phone is out of reach, the Passport says so and records nothing instead of taking a note it cannot deliver.

The app carries its own Tailscale node, so no VPN profile is installed. Every connection dials out from the phone, and nothing listens on it. On the host, tailscale serve gives Ambient an HTTPS address on your tailnet and forwards to the channel on loopback. The same map shows the one part meant to be reached from the internet, Tether.

Your tailnet · one door in
00Your devices meet DuoDuo inside your tailnet. Nothing there is public; Tether is the one door in.
YOUR TAILNETprivate · your devices onlyYOUR MACHINEthe DuoDuo hostINTERNETonly through TetherBLEFunnel, tunnel or proxyyour choicePassportPocket firmwareiPhoneDuoDuo appdials outRoom devicetablet · browsertailscale serve<node>.ts.netHTTPS · tailnet onlyAmbient channelvoice · room pageDuoDuo daemonsessions · intuition layerTether channelloopback · plain HTTPGrok appDots in ChatGPTMeta’s Musepasskey
  1. 01Hold OK on the Passport. Your voice streams to the phone over Bluetooth LE.
  2. 02The phone dials your host over your tailnet: HTTPS to its ts.net address, then Ambient and DuoDuo.
  3. 03The answer comes back the same way, to the phone and the Passport screen.
  4. 04A room device opens the Ambient page at the same address, and listens.
  5. 05Grok, Dots or Muse knock on Tether. Only your passkey opens the door.
Nothing on the tailnet side is public: Ambient is reached through tailscale serve, never Funnel. Tether is the only way in from the internet, and the route to it is yours to pick.

The app#

The app is one conversation with one DuoDuo, reading like a chat with a person plus a voice call. The room it talks to is a setting, not a list to browse. It speaks Chinese or English, following the iPhone's language.

DuoDuo app screen: First conversation
First conversation
DuoDuo app screen: DuoDuo at work
DuoDuo at work
DuoDuo app screen: Task finished
Task finished
DuoDuo app screen: Voice notes
Voice notes
DuoDuo app screen: Hold: preparing
Hold: preparing
DuoDuo app screen: Hold: recording
Hold: recording
DuoDuo app screen: Ambient mode
Ambient mode
DuoDuo app screen: Passport
Passport
  • Hold to talk. Hold the bar; the sheet shows it is preparing, then recording. Release to send, or slide off the bar to cancel.
  • See the work. While DuoDuo works, one compact card shows the current stage and step; after the answer, a single line records how many steps it took.
  • Ambient mode. The phone listens to the room and speaks DuoDuo's answers, and you can cut in mid-word. It runs full screen like a call, or minimised to a bar above the conversation.
  • Accessories in the same thread. A Passport pairs by numeric comparison: the same six digits on the phone and on the device, confirmed with OK. Its voice notes and their answers land in the same conversation, marked with the device.

The Passport#

The Passport is the first Pocket accessory. Every state it shows is one picture of DuoDuo and two lines of text, in Chinese or English to match the paired phone.

Passport screen: Ready
Ready
Passport screen: Listening
Listening
Passport screen: Received
Received
Passport screen: Reply
Reply
Passport screen: Pairing code
Pairing code
Passport screen: Did not catch that
Did not catch that
ButtonAction
Hold OKTalk; release sends. Short taps are ignored.
UP / DOWNPage through the reply on screen, then step to older or newer replies.
Hold UPSettings: brightness, screen timeout, deep sleep, new-reply chime, re-pair.

The screen goes dark when nothing is happening, and holding OK from a dark screen starts talking at once. After an hour idle the Passport goes into deep sleep; any button wakes it and reconnects it to the phone, and that waking press records nothing. The last replies stay on the device through a power-off.

Source#

PartRepository
Passport firmwareopenduo/pocket-passport, a fork of FoloToy's folotoy/ai-passport; the published build is DuoDuo Pocket in the App Library
DuoDuo iPhone appopenduo/pocket-ios, source-available under FSL-1.1-Apache-2.0
Ambient channel and cerebellumopenduo/ambient; see Ambient

The Passport hardware and the original firmware are FoloToy's; see the AI Passport site for the device and its own apps.