Skip to main content

Jolly CLI

Jolly is a local robot-arm physics simulator for terminal users and LLM agents. It uses PyBullet in deterministic direct mode and saves state between commands.

Jolly includes two offline robot profiles:

  • jolly6: an original six-axis arm with a parallel gripper.
  • so101: a lightweight five-axis SO-101 simulation profile with a gripper.

The package also accepts scenes, challenges, an engine benchmark, a native PyBullet viewer, and an optional local web viewer. No cloud service, MCP server, API key, or network connection is required at runtime.

See Jolly in action

Local web simulator

Jolly local web simulator demo

Watch the WebM recording

Terminal-native control

Jolly terminal CLI demo

Watch the MP4 recording

Install

Install the command from PyPI with Python 3.10 or later:

python -m pip install jolly-cli
jolly state --json

For Python development, create a virtual environment on Python 3.10 or later:

python -m venv .venv
. .venv/bin/activate
pip install -e '.[web,dev]'

PyBullet publishes limited binary wheels. On platforms without a matching wheel, use conda-forge or install a C++ build toolchain for the source build.

Install the local LLM skill with the Skills CLI:

npx skills add ./skills/jolly

Quick start

jolly models --json
jolly reset --model jolly6 --scene blocks --json
jolly state --json
jolly move --joints "0,-25,70,-45,0,0" --gripper 0.0 --json
jolly reach --x 0.30 --y 0.10 --z 0.18 --gripper 0.0 --json
jolly render
jolly challenge list --json
jolly benchmark --json

Start the optional local web viewer:

jolly serve --host 127.0.0.1 --port 8765

Open http://127.0.0.1:8765. The JSON API documentation is at http://127.0.0.1:8765/api/docs.

Open the native PyBullet window on a machine with a display:

jolly viewer --model jolly6 --scene blocks

Command contract

All motion uses meters and degrees. Gripper 0.0 means open. Gripper 1.0 means closed. Mutating commands save state under the operating system state directory. Set JOLLY_STATE_DIR to isolate or relocate state.

Important commands:

Command Purpose
jolly state --json Read joints, FK pose, collisions, objects, and grasp state.
jolly move --joints CSV Move to exact joint angles.
jolly reach --x X --y Y --z Z Solve IK and move to a Cartesian point.
jolly fk [--joints CSV] --json Compute forward kinematics without saving a new pose.
jolly render Show a Rich status table and terminal stick figure.
jolly reset Select a model and scene, then home the robot.
jolly scene list/load Discover and load deterministic scenes.
jolly challenge list/start/status Run agent manipulation challenges.
jolly benchmark Check robot loading, FK, and scene construction.

Jolly rejects joint-limit violations and unsafe workspace targets. By default, Jolly rolls back a motion that creates a collision. Use --allow-collision only for controlled collision tests.

Architecture

jolly-cli/
├── pyproject.toml
├── README.md
├── SKILL.md
├── LICENSE-MIT
├── LICENSE-APACHE
├── THIRD_PARTY_LICENSES.md
├── jolly/
│   ├── cli.py
│   ├── benchmark.py
│   ├── challenges.py
│   ├── assets/
│   │   ├── jolly6.urdf
│   │   └── so101.urdf
│   ├── core/
│   │   ├── physics.py
│   │   ├── models.py
│   │   ├── scenes.py
│   │   └── store.py
│   └── web/
│       ├── app.py
│       └── index.html
├── skills/jolly/SKILL.md
└── tests/

Physics scope

PyBullet performs rigid-body simulation, FK, IK, contact generation, and scene settling. Jolly uses deterministic state restoration across short CLI processes. The grasp helper attaches a nearby graspable object while the gripper is closed. This helper makes terminal pick-and-place repeatable. It is not a soft-contact or motor-current model.

The bundled SO-101 profile uses original primitive collision geometry. Its joint layout and limits derive from Apache-2.0 upstream robot metadata. It does not include the upstream CAD meshes and does not claim visual hardware fidelity.

License

Jolly source code and original assets are available under your choice of the MIT License or Apache License 2.0. See LICENSE-MIT and LICENSE-APACHE. Third-party details appear in THIRD_PARTY_LICENSES.md.

Metadata

Release files for jolly-cli 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for jolly-cli 0.1.0
File Size Uploaded
jolly_cli-0.1.0.tar.gz 1.3 MB Details

Built distribution (wheel)

Table of built distributions (wheels) for jolly-cli 0.1.0
File Interpreter ABI Platform
jolly_cli-0.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 1.4 MB

Release files / jolly_cli-0.1.0.tar.gz

Download URL jolly_cli-0.1.0.tar.gz
Size 1.3 MB
Tags Source
SHA-256 checksum
How to use checksums
30b5e074735af4e400701784327cb6a2e6590b1f681a512e475d512bdf48802e
BLAKE2b-256 checksum
How to use checksums
dcf7740f6c6b047893e3f11762f0ce45badf1bcc2eba23b9518c5fc2981fced4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.11.16

Release files / jolly_cli-0.1.0-py3-none-any.whl

Download URL jolly_cli-0.1.0-py3-none-any.whl
Size 33.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
d25e0054751f5d77e10ba267a8478854e3c652bfb30621d042521b390d7bdf12
BLAKE2b-256 checksum
How to use checksums
e69f63c8a0d048b7c967244ad81fec719989684f7bed14ab3d088221ae1b8842
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.11.16

Release history Release notifications | RSS feed

0.6.0

2 release files

0.5.0

2 release files

0.4.0

2 release files

0.3.0

2 release files

0.1.1

2 release files

This release

0.1.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page