Rubi Project
Self-hosted integrations that let an AI agent act for you, only with your approval.
Overview
Rubi gives an AI agent real integrations, starting with mail, and keeps the owner in control. The agent can request any action. Only the owner can unlock Rubi or approve a sensitive action, and Rubi checks each approval cryptographically.
No project servers
Rubi runs on the agent's machine. The panel is a static site.
Your key
Rubi encrypts everything it stores. It starts locked and opens only with your passkey or password.
Signed approvals
A sensitive action runs only after you sign that exact action. You set the level for each action.
Plugins
Each integration is a separate signed plugin with its own updates and permissions.
Architecture
The panel on your device holds the keys. The daemon on the agent's machine holds the data. Everything between them is encrypted end to end, so the carriers see only ciphertext.
Anatomy of the daemon
The same system, drawn as a machine. The agent's computer is opened up, with the daemon's modules inside. Hover over a module to read what it does.
Approving an action
The agent does not describe the action you approve. Rubi builds the preview from its own stored copy of the action, and your passkey signs a hash of that copy.
Keys
The keys that can unlock Rubi never reach the agent's machine. The panel unwraps the data key on your device and passes it to Rubi for one session.
| Key | What | Where it lives | Purpose |
|---|---|---|---|
IK | Instance identity | On the agent machine, unencrypted, because it is needed before unlock | Lets the panel authenticate Rubi and encrypt to it. Pinned at the first pairing |
DEK | Data key, 256-bit | On the agent machine only wrapped; in memory while unlocked | Encrypts the vault: secrets, config, policy, state |
KEK | Key from the passkey | Never stored. The browser derives it from the passkey each time | Wraps the data key |
KEK | Key from the password | Never stored. The browser derives it with Argon2id | Wraps the data key, as a fallback |
AK | Approval credential | Inside the vault | Verifies approval signatures |
Policy
Each action has one of three levels. None runs at once, chat asks with buttons, and strong needs the panel and your passkey. Actions that protect Rubi itself are fixed at strong.
| Action | None | Chat | Strong | |
|---|---|---|---|---|
| Unlock after a restart | Fixed | |||
| Change levels, plugins, passwords, webhook | Fixed | |||
| Install, update or remove a plugin | Fixed | |||
| Send an email | ||||
| Create a draft | ||||
| Read or search |
Transport
Rubi and the panel both open outgoing connections, so neither has an inbound address to attack. Carriers can delay or drop messages, but they cannot read or forge them.
Plugins
A plugin is a release in its own repository. It can be written in any language and talks to Rubi over an open JSON-RPC protocol. Installing a plugin shows its permissions and needs a strong approval.
| Asset | Content |
|---|---|
rubi-plugin.json | The manifest: fields, secrets, actions and their default levels, events, network egress, tools |
<id>-<os>-<arch>.tar.gz | The plugin for one platform |
SHA256SUMS | Hashes of every asset |
SHA256SUMS.sig | Ed25519 signature by the publisher's key from the manifest |
Where it stands
Pre-alpha. The foundations work end to end, but Rubi is not ready for real data yet.
Works today
- The core and the panel
- Signed releases with one-tap updates
- The plugin store
- iCloud Mail: read, search, drafts, approved send, reply notices
Next
- Ready for real data
- More plugins in the store