Skip to main content

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:

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:

  1. refresh the Focale access JWT when needed
  2. create a local Ed25519 keypair if needed
  3. enroll a personal or organisation-scoped agent installation if needed
  4. mint a Hub JWT
  5. discover local ASCOM Remote (Alpaca) servers and register new ones in the selected context
  6. 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)

Source distribution for focale-local-relay 0.5.0
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)

Table of built distributions (wheels) for focale-local-relay 0.5.0
File Interpreter ABI Platform Actions
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 log

Release 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 log

Security 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.

Select from 2 files

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 log

A 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.

Release history Release notifications | RSS feed

This release

0.5.0 This release

2 release files Full provenance

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