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.39-cp313-cp313-win_amd64.whl (1.7 MB view details)

Uploaded CPython 3.13Windows x86-64

orbit_cua-0.2.39-cp313-cp313-manylinux_2_39_x86_64.whl (2.5 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.39+ x86-64

orbit_cua-0.2.39-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.39-cp312-cp312-win_amd64.whl (1.7 MB view details)

Uploaded CPython 3.12Windows x86-64

orbit_cua-0.2.39-cp312-cp312-manylinux_2_39_x86_64.whl (2.5 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.39+ x86-64

orbit_cua-0.2.39-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.39-cp311-cp311-win_amd64.whl (1.7 MB view details)

Uploaded CPython 3.11Windows x86-64

orbit_cua-0.2.39-cp311-cp311-manylinux_2_39_x86_64.whl (2.5 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.39+ x86-64

orbit_cua-0.2.39-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.39-cp310-cp310-win_amd64.whl (1.7 MB view details)

Uploaded CPython 3.10Windows x86-64

orbit_cua-0.2.39-cp310-cp310-manylinux_2_39_x86_64.whl (2.5 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.39+ x86-64

orbit_cua-0.2.39-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.39-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: orbit_cua-0.2.39-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.39-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 4cd5fbd79b2f089dd32fff88ebcf1354321c3e4c33a726963d1d159ff9d73ede
MD5 f99f90905f92e8fc987022444d96e4cc
BLAKE2b-256 f8a65191a0ca5b9a12e676e29842a7568d2df77b9abb1de5870f4fdf317a87b7

See more details on using hashes here.

Provenance

The following attestation bundles were made for orbit_cua-0.2.39-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.39-cp313-cp313-manylinux_2_39_x86_64.whl.

File metadata

File hashes

Hashes for orbit_cua-0.2.39-cp313-cp313-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 af7826753e3689df238ee9731c79c0bd1f47ce7bd8dc09088e5ff125205e8128
MD5 cacb70f77a3597b7295e5dbed8d64619
BLAKE2b-256 e6069108b0ef3cd6aacd703e44ec5ccb40159ae3498f83cc339bb5e6b11962ea

See more details on using hashes here.

Provenance

The following attestation bundles were made for orbit_cua-0.2.39-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.39-cp313-cp313-macosx_10_13_universal2.whl.

File metadata

File hashes

Hashes for orbit_cua-0.2.39-cp313-cp313-macosx_10_13_universal2.whl
Algorithm Hash digest
SHA256 551dbca9b92e41990074c02e3aceb0cea841e39eacd629c0aa3b2ed5b1d5e273
MD5 e32782583094d4e2f80a5550164c63fb
BLAKE2b-256 d2e82a6ea6cc44fb5b47200708d9544789e1a4637381cbec6a329ee838365d12

See more details on using hashes here.

Provenance

The following attestation bundles were made for orbit_cua-0.2.39-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.39-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: orbit_cua-0.2.39-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.39-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 ea9b390899ce27ed55047a1312efe123c4d47a7f7168c9f3b7c29354e87164fa
MD5 59ebebee5f99e66e215c266eeee05546
BLAKE2b-256 ef748ed6113be5fbabbec2d37926275115600d3f8f93cf2f6663199283f5092c

See more details on using hashes here.

Provenance

The following attestation bundles were made for orbit_cua-0.2.39-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.39-cp312-cp312-manylinux_2_39_x86_64.whl.

File metadata

File hashes

Hashes for orbit_cua-0.2.39-cp312-cp312-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 7c5762188b372307ad5bb689ebc7d8d4f6c13a3d70535fff8a4e50589b4b200a
MD5 d3beb43292a1fd9d806358aea5cf3e51
BLAKE2b-256 1066e03264b587d0cac2aed8acb8a5d79ae7277b178afc97e9fe7fea69bdc894

See more details on using hashes here.

Provenance

The following attestation bundles were made for orbit_cua-0.2.39-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.39-cp312-cp312-macosx_10_13_universal2.whl.

File metadata

File hashes

Hashes for orbit_cua-0.2.39-cp312-cp312-macosx_10_13_universal2.whl
Algorithm Hash digest
SHA256 119b825dd2b03b73f11591df27fef8848dc05b92811b3278a21faa9f17226299
MD5 44fa3021295364662add73034ddbc8e1
BLAKE2b-256 a61fa07c36e8641fb1b5010d591961c591cfbde0258f27eaa3fe9720d3a3aab0

See more details on using hashes here.

Provenance

The following attestation bundles were made for orbit_cua-0.2.39-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.39-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: orbit_cua-0.2.39-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.39-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 63b21123de8dc603be827544af863118e42752bc8b4e914aebf5328fc1639e72
MD5 f1c877b71ad2ffb9930958a0a8e6893e
BLAKE2b-256 7b03ef109e60bc9a77c9e91bba04008f3139c79e174bcdf5a4de92a6c052c24f

See more details on using hashes here.

Provenance

The following attestation bundles were made for orbit_cua-0.2.39-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.39-cp311-cp311-manylinux_2_39_x86_64.whl.

File metadata

File hashes

Hashes for orbit_cua-0.2.39-cp311-cp311-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 6e4b21c15cff869d1fac29b80a6587ab8b608af406345bdf5525d036b2904119
MD5 69d7306b987d4cbdd883782dbdb88d0f
BLAKE2b-256 a8a1618e68d1f76a72e62298bbcb1108cabd55d0aa25a91f1beeecd686d38fb0

See more details on using hashes here.

Provenance

The following attestation bundles were made for orbit_cua-0.2.39-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.39-cp311-cp311-macosx_10_9_universal2.whl.

File metadata

File hashes

Hashes for orbit_cua-0.2.39-cp311-cp311-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 c443cc49d7a5c7d7ca7c6396258068afe9ff4da995b1640c33fd0eb73d8b2877
MD5 d2734ce8a8c1b51556bd3f3d36c32e19
BLAKE2b-256 cf0a31f760331480581e01fd6a2e471cb7591b009bdc46b8494d030f6d874592

See more details on using hashes here.

Provenance

The following attestation bundles were made for orbit_cua-0.2.39-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.39-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: orbit_cua-0.2.39-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.39-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 f3aecd898e2a2cf499e3ea38a26f0c03c92f81200a9724d55c2e38d4bfdd7707
MD5 65d108593e302b1127145504b6473caa
BLAKE2b-256 692ba7392a28e6d89ebd2af841ee9c2238fc8341658e90c4a53ddad224230a6d

See more details on using hashes here.

Provenance

The following attestation bundles were made for orbit_cua-0.2.39-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.39-cp310-cp310-manylinux_2_39_x86_64.whl.

File metadata

File hashes

Hashes for orbit_cua-0.2.39-cp310-cp310-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 3c35fa5627891e5ef6619811c2813d7df1e816c8467d9f9f6a9c8061b5d85588
MD5 84397dbd06b0ecbf0395508eb6f46800
BLAKE2b-256 be1669c636d3468732821af29615c632ee5c8355a8ede60431f8ea2cc358bc68

See more details on using hashes here.

Provenance

The following attestation bundles were made for orbit_cua-0.2.39-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.39-cp310-cp310-macosx_10_9_universal2.whl.

File metadata

File hashes

Hashes for orbit_cua-0.2.39-cp310-cp310-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 0ed809ba3907eaf4c4cc65757207755efcf05e2d23957b2597fe880e30281f80
MD5 943ed31bc8ea70c6692e44867b06847f
BLAKE2b-256 1079560c76e0377b029e6b0961f13f0a474414241dbdc1786724d661f119385f

See more details on using hashes here.

Provenance

The following attestation bundles were made for orbit_cua-0.2.39-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