stasis-client
A local remote-desktop client for the Aethernet stasis protocol. It runs on your machine, connects to a remote host running an Aethernet stasis server, and gives you a live (or on-request) view of that host's screen with mouse, keyboard, and clipboard control - as a native window or in your browser.
Features
- Native window or browser - run as a standalone desktop window, or as a regular local web app you open in your browser. Same interface either way.
- Live and Snap input modes - send clicks, scrolls, and keystrokes immediately as you make them, or record a sequence of actions locally and send them to the remote host as a single batch once you're ready.
- Configurable hotkeys - request a screen frame, open a multi-line text input, and start/cancel/send a Snap recording, all bound to your own key combos.
- Multi-click coalescing - double/triple/... clicks are detected locally and sent as a single click event with the right click count, instead of arriving too far apart over the network to register as a multi-click on the remote host.
- Automatic DPI-aware coordinate scaling - clicks land in the right place even when the remote host's screenshot resolution differs from its logical input resolution (e.g. Retina/HiDPI displays).
- Clipboard sync - push your local clipboard to the remote host, or pull the remote host's clipboard back to yours, on demand.
- Bulk text entry - a dedicated popup for pasting or typing long text, sent as a single event instead of one keystroke at a time.
- On-request or interval screen streaming - choose whether frames are pushed continuously or only when you ask for one.
- In-app log viewer - see what the underlying connection is doing without leaving the app.
- Dark, distraction-free interface with a startup animation.
Installation
pip install stasis-client
This installs the stasis-client command.
Stasis-client speaks the stasis protocol over an Aethernet link. The transport itself (AggregatingLink) comes from the separate aethernet-core package, which stasis-client depends on automatically - you don't need to install it yourself.
Quick start
-
Create a link configuration file - a small Python file that tells stasis-client (and, if you use the same file, the Aethernet server too) how to reach your remote host (transport, address, encryption, etc.):
# aethernet_link.py import logging from typing import Literal from aethernet.transport import AggregatingLink async def create_link( mode: Literal["server", "client"], logger: logging.Logger ) -> AggregatingLink: # Build and return your AggregatingLink here. # `mode` is "client" when called from stasis-client. ...
-
Run the client from the same directory:
stasis-client
This opens a native window by default. To open it in your browser instead:
stasis-client --mode browser
That's it - the settings dialog inside the app lets you configure hotkeys, input mode, and streaming behavior without touching the command line again.
Command-line options
| Flag | Description | Default |
|---|---|---|
--mode {window,browser} |
Run as a native window or a local web server | window |
--link-config PATH |
Path to your link config file | ./aethernet_link.py |
--log-level {DEBUG,INFO,WARNING,ERROR,CRITICAL} |
Logging verbosity | DEBUG |
Each of these can also be set via an environment variable (AETHERNET_UI_MODE, AETHERNET_LINK_CONFIG, AETHERNET_LOG_LEVEL) - the CLI flag takes priority when both are set.
In-app settings
Open the settings dialog from the top panel to configure, without restarting the app:
- Session mode - Live (send everything immediately) or Snap (record, review, then send).
- Screen streaming mode - on-request or interval-based, with a configurable interval.
- Hotkeys - request-frame, open-big-input, and the three Snap recording controls (start/cancel/send).
- Multi-click window - how long to wait after a click before deciding how many clicks it was.
- Logs - a live tail of the connection's log output.
Settings persist across restarts.
Requirements
- Python 3.12+
- A running Aethernet stasis server on the host you want to control (see github.com/solment-slet/aethernet)
License
Apache License 2.0 - see the LICENSE file in this repository. Matches the license used by aethernet-core.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file stasis_client-0.1.0.tar.gz.
File metadata
- Download URL: stasis_client-0.1.0.tar.gz
- Upload date:
- Size: 67.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
418558d6bb9e70c5f69da16c13da992f5a45f151879aad20c7779fd3aba51015
|
|
| MD5 |
5a52a2509c0aedec3f3a79424660c8bd
|
|
| BLAKE2b-256 |
fc6a016d650199b6afbd2c60584d18987ee1d3df4e27fd1b3082b0150e9c05f7
|
Provenance
The following attestation bundles were made for stasis_client-0.1.0.tar.gz:
Publisher:
release.yml on solment-slet/stasis-client
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
stasis_client-0.1.0.tar.gz -
Subject digest:
418558d6bb9e70c5f69da16c13da992f5a45f151879aad20c7779fd3aba51015 - Sigstore transparency entry: 2439213283
- Sigstore integration time:
-
Permalink:
solment-slet/stasis-client@e621693a4d9fc16b7cf1af74e8ad214ba8142f5f -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/solment-slet
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@e621693a4d9fc16b7cf1af74e8ad214ba8142f5f -
Trigger Event:
release
-
Statement type:
File details
Details for the file stasis_client-0.1.0-py3-none-any.whl.
File metadata
- Download URL: stasis_client-0.1.0-py3-none-any.whl
- Upload date:
- Size: 70.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b25e03f256db2293b5af1939ba220222123d3289e38388e55deb5c346f547d85
|
|
| MD5 |
d475aa046e6253e165e29e916fd1bfb0
|
|
| BLAKE2b-256 |
fa08f61e8fad82bdb08474b0023f9c6dd472e45be673911bf6c10a2eb8717e98
|
Provenance
The following attestation bundles were made for stasis_client-0.1.0-py3-none-any.whl:
Publisher:
release.yml on solment-slet/stasis-client
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
stasis_client-0.1.0-py3-none-any.whl -
Subject digest:
b25e03f256db2293b5af1939ba220222123d3289e38388e55deb5c346f547d85 - Sigstore transparency entry: 2439213298
- Sigstore integration time:
-
Permalink:
solment-slet/stasis-client@e621693a4d9fc16b7cf1af74e8ad214ba8142f5f -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/solment-slet
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@e621693a4d9fc16b7cf1af74e8ad214ba8142f5f -
Trigger Event:
release
-
Statement type: