Skip to content
apparatus

Open source ยท MIT

A voice agent with its own cloud computer

You talk while it works on its cloud computer, a Linux desktop with a Python session per job, shell commands and Chromium. It shows you the result and is told to ask before it sends, buys or deletes. You run it yourself, with your own Gemini API key.

apparatus is early: it has not yet talked to Gemini or run on a real cloud computer. Where it stands.

The web app at phone size on a job's receipt: the Weekly orders table and report.csv
Captures of the web app in a browser, in demo mode, with a scripted voice; the phone's frame is drawn. The watch is a Paparazzi render of the Wear OS app. How they were made.

How it feels

You talk. It works. It shows you.

  1. 01

    You talk

    Tap the orb and say what you need. There is no text box for requests and no button to hold.

  2. 02

    It works

    The request becomes a job on your cloud computer. The voice keeps talking with you while the job runs.

  3. 03

    It shows you

    The result lands in the feed: what it found, a table, the file it made.

  4. 04

    It asks only when a person must act

    It is told to stop for an approval, a sign-in or a captcha, and to do the rest without you.

The web app at phone size in a browser, in a drawn frame. Demo mode, with a scripted voice.

One control, and it is the orb.

Tap it to start a voice session. Tap it again to end it.

  • Off

  • Listening

  • Working

  • Speaking

To interrupt the agent, talk over it. Above the orb, the screen shows what the model heard you say. A running job shows a small orb of its own. The microphone is open while the agent is on. A voice gate on your device sends audio only while it detects speech.

Your cloud computer

It works on a Linux desktop. You can take Control.

In your own deployment, each user has a cloud computer: a Linux desktop whose files stay between jobs. The agent does the work there while you talk. You can watch it, press Control to use it yourself, and Release it back.

A Python session per job
Each job gets its own Python process. Its variables stay between steps until the job ends or a step runs past its time limit. Shell commands run from Python.
A desktop with Chromium
Xfce and Chromium on a virtual display. The desktop tool clicks, types and takes screenshots. The Google Cloud image adds a terminal and Git.
Files it keeps
A folder per job, memory notes and saved tools stay on its disk. It is told to save a script when a job will repeat.
The result, shown
It is told to end a job with one or two sentences to say, detail in markdown for your screen, and a list of the files it made.

Control and Release

The screen streams live to your device. Press Control to use the desktop yourself; the agent's desktop tool stays locked until you press Release.

The web app in a browser, in demo mode. The screen is a bare X session streamed from agentd, not the VM image's Xfce desktop.

A handoff card: Sign in to the reports site, with Done and Cancel

Handoffs

On a sign-in page, a code request or a captcha, the agent is told to stop. It hands you the screen. You sign in on your cloud computer, press Done, and the job goes on. The agent is told never to solve a captcha.

The web app in a browser, in demo mode: the card at desktop width, the Screen tab at phone size in a drawn frame.

Every device

One agent on the web, desktop, phone and watch.

The same web app runs in the browser and in 2 shells. The web, desktop and phone apps show the same jobs. One of them holds the voice session at a time.

Tauri 2 builds the desktop app for Windows, macOS and Linux. Capacitor 6 builds the phone app for iPhone and Android. Apple Watch and Wear OS have native apps: the orb and a tap.

Built so far: web, Linux, Android, Wear OS. Not yet compiled: iOS, macOS, Windows, Apple Watch. A version tag runs release.yml, which attaches every build to a GitHub Release. No release exists yet. The apps table has the state of each.

  • Phone size: the agent answers with a revenue table and revenue.csv
    An answer
  • Phone size: the request in the feed, the job running with its steps
    Working
  • Phone size: the job done, its table and report.csv in the feed
    Done
  • Phone size: the pane as a bottom sheet on the job's receipt
    Receipt
  • Phone size: the agent asks to send an email, with Approve and Deny
    Approval
  • Phone size: a handoff, the reports site sign-in, with Done and Cancel
    Handoff
  • Phone size: the Screen tab under Control, with Release
    Screen
  • Phone size: Jobs grouped as Needs you, Running and Done
    Jobs

The web app at phone size in a browser, in a drawn frame, not the Android app on a device. Demo mode, with a scripted voice.

The watch is the orb

No text, no buttons. Tap anywhere to start a voice session and tap again to end it. Approvals arrive as notifications with Approve and Deny.

Rendered with Paparazzi from the Wear OS app's code; no watch has run it yet.

Safety

It is told to ask before it sends, buys or deletes.

Approvals before it acts

The agent is told to ask before it sends, buys, deletes, posts, shares or changes an account. The job waits up to 30 minutes for your answer. No answer counts as Deny. You see the action and its details first. Only the model's instructions hold this rule; no code on the server or the cloud computer checks it.

An approval card: send an email to dana@larkspur.example with report.csv, with Approve and Deny
The action and its details, before it happens.
An audit log
The server writes jobs, approvals, handoffs, screens and Control to an append-only log. Nothing on the cloud computer can reach it.
No inbound ports
In the Google Cloud deployment, a firewall rule blocks every inbound connection to the cloud computer. It dials out to the server.
Your key stays on the server
The Gemini API key lives on the session server only. The cloud computer never holds it, and the model never sees it.
Web pages are data
Text from web pages and files reaches the model wrapped and marked as data. The model is told never to follow it as an instruction.
Hands off while you hold it
While you hold Control or a handoff is open, the cloud computer refuses the agent's desktop tool. During a handoff the server refuses it too. One gap is open: Python code in a job can still reach the display. Roadmap item 7.

How it works

Two models, one server, your cloud computer.

Gemini Live talks with your device. Your device sends jobs to the session server, which runs them with a Gemini text model. Your cloud computer dials out to the server and streams the screen to your device. voicejobsdials outthe screen, over WebRTCGemini Livetalks with you, starts jobsYour devicemicrophone, voice gate, screenSession serverthe key, jobs, approvals, auditruns jobs on a Gemini text modelYour cloud computera Linux desktop with agentd

Your device gets a short-lived Live token from the server, so the API key never leaves the server. The cloud computer dials out to the server. In the Google Cloud deployment, a firewall rule blocks every inbound connection to the cloud computer.

The architecture notes follow one voice turn through every part.

Run it

Open source under MIT. Run it on your machine.

The server, the cloud computer's daemon, every client and the Terraform for Google Cloud are in one repository. The text model's instructions and its 4 tool declarations are in one Python file, smart.py. Every message between the parts is in the protocol. Locally, the path is 3 commands that build the server and a virtual desktop in Docker.

$ git clone https://github.com/reagent-systems/apparatus.git && cd apparatus$ cp .env.example .env$ docker compose -f infra/local/docker-compose.yml up --build

Then open http://localhost:8080. Put a GEMINI_API_KEY in .env; without one the voice does not connect and every job fails. Add APPARATUS_DEMO=1 to replace the text model with a scripted one. The voice still needs the key.

Where it stands. apparatus is early. The server and agentd run end to end in tests, against fakes and real Python kernels. It has not yet talked to Gemini, and it has not yet run on a real cloud computer. No app has run on a phone or a watch. The Docker path has not been run end to end yet. The Google Cloud Terraform passes terraform validate but has not been applied to a real project. The status page has the rest.

Waitlist

No hosted version yet.

Today you run it yourself, from the commands above. Leave your email to hear when a hosted version exists.

You are on the list. We email you if a hosted version ships.

The waitlist did not take your email. Check it and try again.

We keep your email and note in a private store and use them only to tell you about a hosted version.

Talk to a computer that does the work.

Read the code, run it on your machine, or build the apps for your devices.

No hosted version yet. Join the waitlist to hear when one exists.