Focale
Focale is a small desktop/CLI bootstrap for Focale users that:
- logs in with the user's Focale account
- creates and stores a local Hub agent identity
- enrolls that identity with Focale when needed
- mints a short-lived Hub JWT
- connects to the Focale Hub using the signed Ed25519 challenge flow
Focale owns its own local state and uses Focale password login to obtain a short-lived bearer JWT plus a refresh token.
User install
Python / terminal
pip install focale-local-relay
Then:
focale login
focale context list
focale context use personal
focale connect --hub-url wss://hub.focale.space/ws/agent
Desktop GUI
python -m focale_local_relay launches the PySide6 desktop app when no CLI arguments are given.
The existing focale console script remains available for terminal-driven workflows.
Windows installer
This repository includes a bootstrap for building a Windows installer from CI. The installer packages
the PySide6 desktop app as focale-relay.exe.
See:
.github/workflows/windows-production.yml.github/workflows/windows-staging.ymlpackaging/windows/focale-relay.issscripts/build_windows.ps1
Commands
focale login
focale status
focale context show
focale context list
focale context use personal
focale context use my-observatory
focale doctor --hub-url wss://hub.focale.space/ws/agent
focale doctor --hub-url wss://hub.focale.space/ws/agent --json
focale connect --hub-url wss://hub.focale.space/ws/agent
focale --api-server https://api.focale.dev connect --hub-url wss://hub.focale.dev/ws/agent --once
focale connect --organisation my-observatory --hub-url wss://hub.focale.space/ws/agent
focale platesolver status
focale platesolver solve --peaks-file ./peaks.json
focale connect will automatically:
- refresh the Focale access JWT when needed
- create a local Ed25519 keypair if needed
- enroll a personal or organisation-scoped agent installation if needed
- mint a Hub JWT
- discover local ASCOM Remote (Alpaca) servers and register new ones in the selected context
- complete the Hub challenge-response handshake
You can set the default context once and keep connect/doctor simple:
focale context use personal
# or
focale context use my-observatory
Plate solving
Plate solving is included with pip install focale-local-relay — arcsecond-astrometry
is a mandatory dependency and ships native binaries for Windows, macOS, and Linux with no Docker
or external tooling required.
focale platesolver status
focale platesolver solve --peaks-file ./peaks.json --scales 6
You can also target a remote service:
focale platesolver status --service-url http://127.0.0.1:8900
focale platesolver solve --service-url http://127.0.0.1:8900 --peaks-file ./peaks.json
Development
python -m venv .venv
source .venv/bin/activate
pip install -e .[dev]
pytest -q
Publishing
This repo includes:
- a PEP 621
pyproject.toml - a CI workflow for tests
- a PyPI publish workflow on tags such as
v0.2.0 - a Windows installer workflow that builds a PyInstaller bundle and wraps it with Inno Setup
Metadata
Release files for focale-local-relay 0.5.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| focale_local_relay-0.5.0.tar.gz | 267.4 kB | With provenance | Details for focale_local_relay-0.5.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| focale_local_relay-0.5.0-py3-none-any.whl | Python 3 | none | any | Details for focale_local_relay-0.5.0-py3-none-any.whl |
Total release size: 492.3 kB
Release files / focale_local_relay-0.5.0.tar.gz
| Download URL | focale_local_relay-0.5.0.tar.gz |
|---|---|
| Size | 267.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
4d66b15fbd6a59ef0a00e1b859ce58172ae9329fc0a01086c8c1a3847f23d88a
|
|
BLAKE2b-256 checksum How to use checksums |
925e5424e41b5ba7bd0eced339c558535f93c1d804f8b7a3e9de1ab32a599634
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 10, 2026.
Transparency logRelease files / focale_local_relay-0.5.0-py3-none-any.whl
| Download URL | focale_local_relay-0.5.0-py3-none-any.whl |
|---|---|
| Size | 224.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
7f5d1e62609e96344763a18931df2623a89f950129b149db22606c9f3d677c9b
|
|
BLAKE2b-256 checksum How to use checksums |
7043e15e6bab6aa34eac8faebfab9c68a01e7fc982d73bbe1d6427110fca74e3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 10, 2026.
Transparency logSecurity for focale-local-relay 0.5.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for focale_local_relay-0.5.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 10, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.