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

Uploaded CPython 3.13Windows x86-64

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

Uploaded CPython 3.12Windows x86-64

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

Uploaded CPython 3.11Windows x86-64

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

Uploaded CPython 3.10Windows x86-64

orbit_cua-0.2.38-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.38-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.38-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: orbit_cua-0.2.38-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.38-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 5387b463949a3e194e0dc7b80a32a97d0baab3b0c2ea30c8668bc95c2ceddc6f
MD5 96c7d46a0e2af07c38871e79bf89482e
BLAKE2b-256 c1bac43a72c7225a6bfa0bb8a4b04d82635f6ab289e036c587668c0d37c949ef

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.38-cp313-cp313-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 a233c83ad34a66f149ad911710996d821e467d0a5c41678cc00998f1b0de00e3
MD5 a1cafb57a398b75863630a0ea6fd363e
BLAKE2b-256 f5bb0916ffc894c1c4fb42bdcb542f91695e775ec1103c14441a0be012559067

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.38-cp313-cp313-macosx_10_13_universal2.whl
Algorithm Hash digest
SHA256 1d779585654838c739fe108238ccf9bf35cea4d143249b4a5eb33e4943774f8e
MD5 ec3991f1980946b5b2bdb4086f7c0cb7
BLAKE2b-256 54191538fed5d80e85192945626f0379618203c5d30cd6ea8cf61bd89a4948b0

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: orbit_cua-0.2.38-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.38-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 698a8c8d13db259a4fb804cc2a69347a51d5daef1f7d44b4665af191446873bc
MD5 abbaa8fa741a9efda680ac325c8acb81
BLAKE2b-256 e676c26449cd92b1ff148ff5a3dcf49f98e54db02af4c9a65aaaece45a46bc45

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.38-cp312-cp312-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 2e80d188de49eac4f6545ed19aa150dc778365299fb7abb14e87cac6aace67a3
MD5 b374dbe82be88503054bf0bb7929bd4a
BLAKE2b-256 fd5d815bc5d4b5d8dc4214b4e00e3eb9464651b8847685461d9a400b5b57dc61

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.38-cp312-cp312-macosx_10_13_universal2.whl
Algorithm Hash digest
SHA256 cd0fb20f9301edc055edce541698d85185e5bb7ab1afc1a7df4be27d6b95db7c
MD5 75625c10dcceaa981eab64f3571770b8
BLAKE2b-256 245abaf2ba7f09b1b20f102f4564ce1a1bc7805f45ae7450d2eeb412bf43f463

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: orbit_cua-0.2.38-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.38-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 eb795a54ea9658dbb0da5d9954b6ce350706e694aaa4cbe2f879bdc782e9e202
MD5 2a3322e5b50d5ccbb952a238f98b53ce
BLAKE2b-256 38bc3986ccde9a56959c0b5f32d2f2942b53c9e6194cbdc571179b6a7b91dcfc

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.38-cp311-cp311-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 2846d538833943a334df275b5401f60d0d156a8a6821c52fa884387d49a7b51c
MD5 0923007dca398a9c4e49102e3bba79a7
BLAKE2b-256 ab61d72a767aabc0454727ead9be571951e23a003495ed57a7d4bad34b3015a4

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.38-cp311-cp311-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 1f889d631dcf6c16b3b7127eeecfab3db523f6146cd75459ed0de9fcf514c781
MD5 1b5f6c5e29ceae749a0a70b4a8e16577
BLAKE2b-256 ea17ffc6173f6e5e7176e0a35ba8d7af40a611fe423fddfcf3f40b25322d71a6

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: orbit_cua-0.2.38-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.38-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 cf9aabc2b713276e1f1ec576e6e9a5d9e13060f271c35a9d4be566bbe58b03fd
MD5 92e70b05d0c3cd98d4a8fe263ff2502f
BLAKE2b-256 87c8f124515b41d2668b9731562a0c8b3750034164e90f9ddeecaaebe0826440

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.38-cp310-cp310-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 6f5e7cd274f5061503ec4244928dc387a3e69331c22c0be1a6b090bab8894f47
MD5 8473d3cec26b53a69a5c6fb8ef12497f
BLAKE2b-256 e04452864fab12c76e0a5fee3d1ea4d2dea692e7e6c82fa71e3c3afced4f8007

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for orbit_cua-0.2.38-cp310-cp310-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 d416a503fa0d9b82995f3760335670fe08cb589233938cca53191dc03aaff5c5
MD5 084b920158297e3f4119dc90863dd32d
BLAKE2b-256 b3eaf770ae2d4d96b77675b8f2bac5a3f1dd12ad418fa5ea013012885aa68f95

See more details on using hashes here.

Provenance

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