Skip to main content

Python client for the Arker virtual computer platform.

Project description

Arker Python SDK

A small wrapper around the Arker VM API: fork a machine, run commands, sync files.

Install

pip install arker

Python 3.10+, no runtime dependencies. The client reads your key from ARKER_API_KEY — get one in the console.

Quickstart

from arker import Arker

ar = Arker(region="us-west-2")

# Fork a public golden, run a command, read/write a file.
vm = ar.fork("ubuntu-full")  # public golden — org inferred

print(vm.run("python3 -c 'print(2 + 2)'").stdout.decode())

vm.sync("/tmp/data.txt", "hello\n")   # write
data = vm.sync("/tmp/data.txt")       # read -> bytes

vm.delete()

Core API

ar = Arker(region=..., api_key=None, base_url=None, retry=None)

# VMs
ar.fork("ubuntu-full")                        # public golden by name (org inferred)
ar.fork(vm, name="child")                     # an existing VM (uses its id)
ar.fork(source_vm_name=..., source_org_id=..., name=None, durable=False)
ar.list_vms(state=None)
ar.vm(vm_id)                                  # bare handle
ar.vm(vm_id).run(command, **options)
ar.vm(vm_id).resize(vcpu_count=..., memory_mib=...)
ar.vm(vm_id).delete()

# Files inside a VM
vm.sync(path)                                 # read  -> bytes
vm.sync(path, data)                           # write

# Filesystems — standalone, persistent volumes
ar.create_filesystem(name=...)
ar.list_filesystems()
ar.delete_filesystem(filesystem_id)

# Syncs — mount a filesystem into a VM at a path
vm.create_sync(filesystem_id=..., path=...)
vm.list_syncs()
vm.delete_sync(sync_id)

api_key falls back to ARKER_API_KEY; region to ARKER_REGION. Pass base_url for dev targets. Configure retries with RetryOptions(...), or retry=False to disable.

Interactive terminal (PTY)

Open a real pseudo-terminal in a VM and drive it interactively — stream raw terminal bytes out, send keystrokes in (incl. control chars like Ctrl-C), resize, and kill. isatty() is true inside, so an interactive shell, vim, htop, a REPL, and claude all work. Transport is a TLS WebSocket; a key can only attach to its own org's VMs.

Install the optional WebSocket dependency: pip install 'arker[pty]'.

import sys

vm = ar.fork("ubuntu-full")

# on_data is called from a background reader thread with raw output bytes.
pty = vm.create_pty(
    cols=80,
    rows=24,
    on_data=lambda b: sys.stdout.buffer.write(b) or sys.stdout.flush(),
    # command defaults to the login shell; it is a single executable path
    # (no shell-splitting) — launch a shell and send_input() it.
)

pty.send_input(b"ls -la\n")
pty.resize(cols=120, rows=40)   # a full-screen app reflows
pty.wait()                       # block until the shell exits, or:
pty.kill()                       # tear it down

b"\x03" (Ctrl-C) interrupts the running program, exactly like a local terminal. To embed in a browser terminal, forward the same bytes to/from xterm.js.

Durability

For long-running or non-idempotent work, fork with durable=True and pass an idempotency key when retrying a run:

import uuid

vm = ar.fork("ubuntu-full", durable=True)
vm.run("python3 train.py", background=True, idempotency_key=str(uuid.uuid4()))

If the host fails mid-run, the run resumes on a healthy host with the VM's filesystem state preserved. Backends without durability raise ArkerError(code="unsupported_operation").

Compatibility imports

The Python package includes limited compatibility modules for common Daytona, E2B, and Modal sandbox workflows. For the supported surface below, migration is a one-line import change:

SDK Replace With
Daytona from daytona import Daytona from arker.daytona import Daytona
E2B from e2b import Sandbox from arker.e2b import Sandbox
Modal provider-specific imports from arker.modal import Sandbox

Daytona

from arker.daytona import Daytona

daytona = Daytona()
sandbox = daytona.create()
try:
    response = sandbox.process.exec("echo 'Hello, World!'")
    print(response.result)
finally:
    sandbox.delete()

Supported Daytona surface:

  • Daytona()
  • daytona.create()
  • daytona.get(id)
  • daytona.delete(id_or_sandbox)
  • sandbox.id
  • sandbox.process.exec(command)
  • sandbox.process.execute_command(command)
  • sandbox.delete()

E2B

from arker.e2b import Sandbox

sandbox = Sandbox.create()
try:
    result = sandbox.commands.run('echo "Hello from E2B Sandbox!"')
    print(result.stdout)
finally:
    sandbox.kill()

Supported E2B surface:

  • Sandbox.create()
  • Sandbox.create(template_id)
  • Sandbox.connect(id)
  • sandbox.sandbox_id / sandbox.sandboxId
  • sandbox.commands.run(command)
  • sandbox.files.read/write/make_dir/makeDir/list/exists/remove
  • sandbox.kill()

Modal

from arker.modal import Sandbox

sandbox = Sandbox.create()
try:
    process = sandbox.exec("echo", "hello")
    print(process.stdout.read())
finally:
    sandbox.terminate()

Supported Modal surface:

  • Sandbox.create()
  • Sandbox.from_id(id) / Sandbox.fromId(id)
  • sandbox.sandbox_id / sandbox.sandboxId
  • sandbox.exec(*command)
  • process.stdout.read()
  • process.stderr.read()
  • process.wait()
  • sandbox.terminate()

Unsupported provider-specific methods and options throw explicit errors instead of being silently ignored. Arker credentials come from ARKER_API_KEY and optional ARKER_REGION / ARKER_BASE_URL.

License

Apache-2.0

Project details


Download files

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

Source Distribution

arker-0.6.2.tar.gz (38.3 kB view details)

Uploaded Source

Built Distribution

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

arker-0.6.2-py3-none-any.whl (22.7 kB view details)

Uploaded Python 3

File details

Details for the file arker-0.6.2.tar.gz.

File metadata

  • Download URL: arker-0.6.2.tar.gz
  • Upload date:
  • Size: 38.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.4

File hashes

Hashes for arker-0.6.2.tar.gz
Algorithm Hash digest
SHA256 2f2d2856554f50ac9c1b9d741476e56e58cb3ab1de4982e055bdc0e1882a7071
MD5 75085df66a7ee77282ace1fd7c35cc31
BLAKE2b-256 b51f8588136d792b775c8e8e3684c5a7ba86f78472be9d1afa97e7e97ab647e2

See more details on using hashes here.

File details

Details for the file arker-0.6.2-py3-none-any.whl.

File metadata

  • Download URL: arker-0.6.2-py3-none-any.whl
  • Upload date:
  • Size: 22.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.4

File hashes

Hashes for arker-0.6.2-py3-none-any.whl
Algorithm Hash digest
SHA256 69143c12ab130bc31f35cdf65e287482ff7aead894ae03ff48334cd732e0f8a2
MD5 d0a401616f0977a5b7fe1c7a2b0f7788
BLAKE2b-256 ba3d13eab841eec899d4e1ab66ad54fd3d5b5c5b5f1990476a3a553a4ed17b25

See more details on using hashes here.

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