unitport — UnitPort local helper
Headless daemon that connects a local GPU / Isaac Lab host (workstation or the user's own cloud server) to the UnitPort cloud canvas. The canvas is the remote control (遥控器); this process has no GUI — only terminal output.
Authoritative design:
../knowledges/local_helper_design.md(rulings LH-D1…LH-D6, contracts C10 pairing / C11 control protocol).
What it is (and is not)
- Is: an outbound-only WebSocket agent exposing a fixed verb set to the cloud (report capabilities, publish an asset index, receive a bundle from the user's own canvas, start/stop a training run, stream telemetry).
- Is not: a shell, an exec server, or a GUI. The cloud can never send an arbitrary command — only the fixed verbs, only from a paired session of the same account, only bundles that originate from the user's own canvas (least-privilege red line, LH-D4 / C11).
The same binary serves execution target ① (UserServerTarget, user cloud
server) and ③ (LocalHelperTarget, local host) — only the host differs (LH-D5).
Install
pip install unitport
Cross-platform (Windows + Linux). Runtime deps: websockets (the live link) and,
on Python < 3.11, tomli (TOML reader). Everything else is stdlib.
CLI (headless — everything else is driven remotely from the canvas)
| Command | Purpose |
|---|---|
unitport login |
Browser-approve device pairing; stores a refreshable helper token |
unitport up (serve) |
Dial out to the cloud relay and serve the fixed verb set |
unitport status |
Connection / run state, paired account, config summary |
unitport config |
Declare Isaac/MuJoCo interpreter paths + resource roots |
unitport doctor |
Fail-loud self-check (interpreters, deps, cloud, token) |
There are deliberately no pull / train / push local subcommands — those
are remote verbs, triggered from the canvas (C11 §4).
Config
- Config dir:
%APPDATA%\unitport\(Windows) ·$XDG_CONFIG_HOME/unitport/or~/.config/unitport/(POSIX). Override withUNITPORT_HOME. config.toml— cloud base URL, engine interpreter paths,resource_roots, workspace dir. Human-editable; also managed byunitport config.token.json— the helper token (secret;chmod 600on POSIX). Never printed, never logged.device.json— the persistent (non-secret)device_id.
Status
Under active construction (phases LH-P1…LH-P8, Isaac Lab first). See the design
doc §12 for the phase map. This tree currently implements the local foundation
(config, capability detection, doctor, CLI) plus the pairing/transport clients;
the workers/relay Durable Object cloud side lives in ../workers/relay.
Release files for unitport 0.0.78
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| unitport-0.0.78.tar.gz | 677.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| unitport-0.0.78-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 1.3 MB
Release files / unitport-0.0.78.tar.gz
| Download URL | unitport-0.0.78.tar.gz |
|---|---|
| Size | 677.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
30fe74dbfe77bb17a8a130be2213e5fd79eaafa05bf3cf2578271f6f92ca2a95
|
|
BLAKE2b-256 checksum How to use checksums |
085a7b81c42f9cfb8c5654f96722428b802803c07469ae60c893003683dd3ce9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.7
|
Release files / unitport-0.0.78-py3-none-any.whl
| Download URL | unitport-0.0.78-py3-none-any.whl |
|---|---|
| Size | 660.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
342928d7c5a66497c65038b28609a03ff852502098578afd670aec06a41f42f6
|
|
BLAKE2b-256 checksum How to use checksums |
a47f732a50b688bfb1e66c182f70b80ea6345998c5ccaec3d1c677266a7687d5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.7
|