Skip to main content

General computer-use agent.

Project description

Orbit logo

Autonomous agents are demos. Controlled agents are products.


Watch Orbit in action


The problem

AI agents can use computers now.

But in practice:

  • they loop
  • they click the wrong thing
  • they get stuck on simple steps
  • they're impossible to steer mid-task

Most frameworks either hide everything in a black box, or hand you raw tools with no structure.

Neither works in production.

Orbit

Natural language controls the screen.
Python controls the flow.

Instead of one monolithic agent, Orbit breaks execution into independent steps:

Do · Read · Check · Navigate · Fill · Bootstrap

Each step runs its own model, has its own budget, and returns typed output. All steps share context.

Why this matters

  • Use a cheap model for simple clicks, a powerful one for complex reasoning
  • Cap LLM calls per step , nothing runs forever
  • Inject guidance mid-execution when the agent is struggling
  • Extract structured data directly into Pydantic models
  • Toggle planner=False for low-latency direct execution

This turns agents from demos into usable systems.

Key difference

Most agents see pixels.

Orbit sees the UI.

It reads the OS accessibility tree and drives the browser via its live DOM. Screenshots only when needed. Works across desktop apps, browsers, and Electron apps — including Cloudflare-protected sites.

Quickstart

pip install orbit-cua
from dotenv import load_dotenv
load_dotenv()

from orbit import Agent
import asyncio

async def main():
    result = await Agent(
        task="Open Chrome and go to Wikipedia",
        llm="gemini-3-pro-preview",
        verbose=True,
    ).run()
    print(result.status)

asyncio.run(main())

Set your API key , Orbit supports any model via LiteLLM:

export GEMINI_API_KEY="your-key"   # or OPENAI_API_KEY / ANTHROPIC_API_KEY

Composable SDK

When you need precision, drop to the SDK:

from dotenv import load_dotenv
load_dotenv()


from orbit import Do, Read, Check, Navigate, session
from pydantic import BaseModel
import asyncio

class Product(BaseModel):
    name: str
    price: float
    in_stock: bool

class ProductList(BaseModel):
    products: list[Product]

async def main():
    action_model = "gemini-3-flash-preview"

    async with session() as s:
        await Navigate(
            "https://www.amazon.com/s?k=mechanical+keyboard",
            session=s, llm=action_model, max_steps=30, planner=False,
            extra_info="Avoid bookmark bar links; use direct navigation tools first.",
            verbose=True,
        ).run()

        if await Check(
            "The current page is a Captcha page and `Continue Shopping` button is visible",
            session=s, llm=action_model, max_steps=30, planner=False,
        ).check():
            await Do(
                "Click `Continue Shopping`, then solve the Captcha.",
                session=s, llm=action_model, max_steps=30,
            ).run()

        products = await Read(
            "All search results",
            schema=ProductList,
            session=s, llm=action_model, max_steps=30, verbose=True,
        ).run()

        cheapest = min(products.output.products, key=lambda p: p.price)

        await Do(f"click on '{cheapest.name}'", session=s, llm=action_model, max_steps=30).run()

        if await Check("Add to Cart button is visible", session=s, llm=action_model, max_steps=30).check():
            await Do("click Add to Cart", session=s, llm=action_model, max_steps=30).run()

asyncio.run(main())

Bootstrap — install packages before the workflow starts

from orbit import Bootstrap, Do, session
import asyncio

async def main():
    # Install system packages once — no LLM, pure subprocess
    await Bootstrap(["ffmpeg", "imagemagick"]).run()

    async with session() as s:
        await Do("Convert video.mp4 to a GIF using ffmpeg", session=s).run()

asyncio.run(main())

The idea

Agents shouldn't be one giant prompt.

They should be composable systems.

Orbit gives you:

  • verbs instead of prompts
  • steps instead of guesswork
  • control instead of hope

Custom actions

Build reusable, domain-specific actions by subclassing BaseActionAgent:

from dotenv import load_dotenv
load_dotenv()

from orbit import BaseActionAgent, Navigate, session
from pydantic import BaseModel
import asyncio

class ProductList(BaseModel):
    products: list[dict]

class ReadTopProducts(BaseActionAgent):
    def __init__(self, category: str, **kw):
        super().__init__(max_steps=12, planner=False, **kw)
        self.category = category

    def task_prompt(self) -> str:
        return (
            f"Read top products for '{self.category}' from the current page. "
            "Extract name, price, and stock status only. Do not click or navigate."
        )

    def output_schema(self):
        return ProductList

async def main():
    async with session() as s:
        await Navigate("https://www.amazon.com/s?k=mechanical+keyboard", session=s).run()
        result = await ReadTopProducts(
            category="mechanical keyboard",
            session=s, llm="gemini-3-flash-preview", verbose=True,
        ).run()
        print(result.output.products[:3])

asyncio.run(main())

Examples

See examples/ for full end-to-end scripts, including a LinkedIn Easy Apply bot that applies to jobs autonomously.

Installation

Install from source

Build from source (requires Rust)
git clone --recurse-submodules https://github.com/aadya940/orbit.git
cd orbit

cd oculos && cargo build --release && cd ..
mkdir -p orbit/_bin

# Linux/macOS
cp oculos/target/release/oculos orbit/_bin/oculos

# Windows
copy oculos\target\release\oculos.exe orbit\_bin\oculos.exe

pip install .

Also requires Tk GUI toolkit for tkinter python.

sudo apt install python3-tk

macOS users: grant accessibility permissions as described here.

Support matrix

OS Architectures
Windows x86-64 (win_amd64)
Linux x86-64 (manylinux)
macOS Intel + Apple Silicon (universal2)
Python 3.10 · 3.11 · 3.12 · 3.13

Safety

No permanent file deletion , destructive operations go to Trash/Recycle Bin. Disk writes require explicit human approval via a configurable callback.

License

Apache 2.0 , Special thanks to OculOS and the open-source packages that make this possible.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

orbit_cua-0.2.37-cp313-cp313-win_amd64.whl (1.7 MB view details)

Uploaded CPython 3.13Windows x86-64

orbit_cua-0.2.37-cp313-cp313-manylinux_2_39_x86_64.whl (2.4 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.39+ x86-64

orbit_cua-0.2.37-cp313-cp313-macosx_10_13_universal2.whl (1.4 MB view details)

Uploaded CPython 3.13macOS 10.13+ universal2 (ARM64, x86-64)

orbit_cua-0.2.37-cp312-cp312-win_amd64.whl (1.7 MB view details)

Uploaded CPython 3.12Windows x86-64

orbit_cua-0.2.37-cp312-cp312-manylinux_2_39_x86_64.whl (2.4 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.39+ x86-64

orbit_cua-0.2.37-cp312-cp312-macosx_10_13_universal2.whl (1.4 MB view details)

Uploaded CPython 3.12macOS 10.13+ universal2 (ARM64, x86-64)

orbit_cua-0.2.37-cp311-cp311-win_amd64.whl (1.7 MB view details)

Uploaded CPython 3.11Windows x86-64

orbit_cua-0.2.37-cp311-cp311-manylinux_2_39_x86_64.whl (2.4 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.39+ x86-64

orbit_cua-0.2.37-cp311-cp311-macosx_10_9_universal2.whl (1.4 MB view details)

Uploaded CPython 3.11macOS 10.9+ universal2 (ARM64, x86-64)

orbit_cua-0.2.37-cp310-cp310-win_amd64.whl (1.7 MB view details)

Uploaded CPython 3.10Windows x86-64

orbit_cua-0.2.37-cp310-cp310-manylinux_2_39_x86_64.whl (2.4 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.39+ x86-64

orbit_cua-0.2.37-cp310-cp310-macosx_10_9_universal2.whl (1.4 MB view details)

Uploaded CPython 3.10macOS 10.9+ universal2 (ARM64, x86-64)

File details

Details for the file orbit_cua-0.2.37-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: orbit_cua-0.2.37-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 1.7 MB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for orbit_cua-0.2.37-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 40bf86660e53eab66abeed2e4646a5f020b8c12966af49416b3ebc51841b010b
MD5 b9ad8e9be1f5964880521f477b41996b
BLAKE2b-256 f10742e28c45ee76f7dc6faa3b026960946458cb1e865ee7006308d08e205683

See more details on using hashes here.

Provenance

The following attestation bundles were made for orbit_cua-0.2.37-cp313-cp313-win_amd64.whl:

Publisher: release.yml on aadya940/orbit

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file orbit_cua-0.2.37-cp313-cp313-manylinux_2_39_x86_64.whl.

File metadata

File hashes

Hashes for orbit_cua-0.2.37-cp313-cp313-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 fb1364d1d3d4d6a25d82b5eb126792a2ee452ec476d3ad4d14fdc1499d294db9
MD5 8152ee3d8dc90cd80d83c8dd56bc619d
BLAKE2b-256 3a79729731583aae72215f875fd6c579d5fdb14a9c86f60bb968244e16ab6b84

See more details on using hashes here.

Provenance

The following attestation bundles were made for orbit_cua-0.2.37-cp313-cp313-manylinux_2_39_x86_64.whl:

Publisher: release.yml on aadya940/orbit

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file orbit_cua-0.2.37-cp313-cp313-macosx_10_13_universal2.whl.

File metadata

File hashes

Hashes for orbit_cua-0.2.37-cp313-cp313-macosx_10_13_universal2.whl
Algorithm Hash digest
SHA256 08009b673e505e362c4ed1b8f9ba1c726e63baf3d830524b34c671f638c34947
MD5 44c2560e4c6b3093eba89502af80cb26
BLAKE2b-256 fd88d35cae199da183c24a61720360beb69652e3bb9e4564df23df8f6b0cf818

See more details on using hashes here.

Provenance

The following attestation bundles were made for orbit_cua-0.2.37-cp313-cp313-macosx_10_13_universal2.whl:

Publisher: release.yml on aadya940/orbit

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file orbit_cua-0.2.37-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: orbit_cua-0.2.37-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 1.7 MB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for orbit_cua-0.2.37-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 59a690bd2adf48635b8ae3a79e866ff88014043f9031229b541bbc91e01eaa41
MD5 cf16e7517bf6c5d34c53765d996c469f
BLAKE2b-256 dc7bc2e5c952a6a3ab48f7110b4e7f62f585c7a9afa5cb47a255885eae3e392d

See more details on using hashes here.

Provenance

The following attestation bundles were made for orbit_cua-0.2.37-cp312-cp312-win_amd64.whl:

Publisher: release.yml on aadya940/orbit

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file orbit_cua-0.2.37-cp312-cp312-manylinux_2_39_x86_64.whl.

File metadata

File hashes

Hashes for orbit_cua-0.2.37-cp312-cp312-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 22067595b2fd96123d5f9b328385acda7106ca23df81143c4fe591b3330f5cd5
MD5 a0ab4e33032cb4f753e9290dfd6187a4
BLAKE2b-256 ca21aab434b473da45dcd9f892f640da7c6f776ea447a10ac7071df6edfc9981

See more details on using hashes here.

Provenance

The following attestation bundles were made for orbit_cua-0.2.37-cp312-cp312-manylinux_2_39_x86_64.whl:

Publisher: release.yml on aadya940/orbit

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file orbit_cua-0.2.37-cp312-cp312-macosx_10_13_universal2.whl.

File metadata

File hashes

Hashes for orbit_cua-0.2.37-cp312-cp312-macosx_10_13_universal2.whl
Algorithm Hash digest
SHA256 dc55fc98d3c1653317ba7cb933e3bcdfdf06f687a5ef30ebdc14117d28e3d833
MD5 19f6b81e8ab47e6c4ab4ed4906d63c26
BLAKE2b-256 1250534efbb44f642fa83a5c0286b1688e482cb3e6e319016460d9f7dbfaf778

See more details on using hashes here.

Provenance

The following attestation bundles were made for orbit_cua-0.2.37-cp312-cp312-macosx_10_13_universal2.whl:

Publisher: release.yml on aadya940/orbit

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file orbit_cua-0.2.37-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: orbit_cua-0.2.37-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 1.7 MB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for orbit_cua-0.2.37-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 59a296dd3d2efdae4026bd4d516fb05b06fa0e87134d96cabffe4faebe1420d9
MD5 e6b61c08ef3ee0266a084d59b7244ba9
BLAKE2b-256 7287bbca4e25564ac9e1d025bd6efd31d5340e1a60910705a4321928bd74ed62

See more details on using hashes here.

Provenance

The following attestation bundles were made for orbit_cua-0.2.37-cp311-cp311-win_amd64.whl:

Publisher: release.yml on aadya940/orbit

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file orbit_cua-0.2.37-cp311-cp311-manylinux_2_39_x86_64.whl.

File metadata

File hashes

Hashes for orbit_cua-0.2.37-cp311-cp311-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 6c3434a0037531e0192e38ebf6cf798a126dfc4ab046a3c200e210a3c9d44e45
MD5 1e98d4d2ba79e82cbc38cb3e87887ea0
BLAKE2b-256 c2ed5a34d1d6e9fe377424a4b6f8c1213028aee8d38ec52a0fc7b2fbbb9b16ae

See more details on using hashes here.

Provenance

The following attestation bundles were made for orbit_cua-0.2.37-cp311-cp311-manylinux_2_39_x86_64.whl:

Publisher: release.yml on aadya940/orbit

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file orbit_cua-0.2.37-cp311-cp311-macosx_10_9_universal2.whl.

File metadata

File hashes

Hashes for orbit_cua-0.2.37-cp311-cp311-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 33e11c9f37a3e2893d1a27b1ce76726167b47dcef49607e88c7ca948e47c0ade
MD5 84c3f11efd5dc599f81bbf82030e1cbe
BLAKE2b-256 a0f707ac5492597ec04e051a7cee6ebfb2a20e0b7c424c82f8a76e539973423f

See more details on using hashes here.

Provenance

The following attestation bundles were made for orbit_cua-0.2.37-cp311-cp311-macosx_10_9_universal2.whl:

Publisher: release.yml on aadya940/orbit

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file orbit_cua-0.2.37-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: orbit_cua-0.2.37-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 1.7 MB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for orbit_cua-0.2.37-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 48aa6b9587a5d38ab80bf053f123c4d640fd5e33a085fc06b7c8f8daae17b3c0
MD5 87052e05343ae9abca0eb0b594a3a906
BLAKE2b-256 e9b97be4b40076c1da76805c3f1e287994533bf4049aa95522da1d44c297bb76

See more details on using hashes here.

Provenance

The following attestation bundles were made for orbit_cua-0.2.37-cp310-cp310-win_amd64.whl:

Publisher: release.yml on aadya940/orbit

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file orbit_cua-0.2.37-cp310-cp310-manylinux_2_39_x86_64.whl.

File metadata

File hashes

Hashes for orbit_cua-0.2.37-cp310-cp310-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 e812621918f108b134d130ba40e069551a773cbd4f5b12eec28a54c8a22f0987
MD5 b637fdf299a83685236fd8bb69ad264f
BLAKE2b-256 b2a67671154790d6934f947dcb6e2c333f75194b8ae60cbdd4bc6dc080363a4a

See more details on using hashes here.

Provenance

The following attestation bundles were made for orbit_cua-0.2.37-cp310-cp310-manylinux_2_39_x86_64.whl:

Publisher: release.yml on aadya940/orbit

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file orbit_cua-0.2.37-cp310-cp310-macosx_10_9_universal2.whl.

File metadata

File hashes

Hashes for orbit_cua-0.2.37-cp310-cp310-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 7572109419e356c48b7054927802885a5e7aed01517002af1c816f933e3f00f5
MD5 7069a765c8c459434f6b91a45504708d
BLAKE2b-256 4ce296547177cadb709654608945b0b3fb404ee47d8cb403d4c2346f175ac9b8

See more details on using hashes here.

Provenance

The following attestation bundles were made for orbit_cua-0.2.37-cp310-cp310-macosx_10_9_universal2.whl:

Publisher: release.yml on aadya940/orbit

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page