{"id":51509096,"url":"https://github.com/arcsecond-io/focale-local-relay","last_synced_at":"2026-07-08T04:01:11.062Z","repository":{"id":344847009,"uuid":"1172688758","full_name":"arcsecond-io/focale-local-relay","owner":"arcsecond-io","description":null,"archived":false,"fork":false,"pushed_at":"2026-06-10T08:21:01.000Z","size":483,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-06-10T10:08:16.316Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/arcsecond-io.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-04T15:35:27.000Z","updated_at":"2026-06-10T08:21:36.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/arcsecond-io/focale-local-relay","commit_stats":null,"previous_names":["arcsecond-io/focale","arcsecond-io/focale-local-relay"],"tags_count":11,"template":false,"template_full_name":null,"purl":"pkg:github/arcsecond-io/focale-local-relay","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arcsecond-io%2Ffocale-local-relay","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arcsecond-io%2Ffocale-local-relay/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arcsecond-io%2Ffocale-local-relay/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arcsecond-io%2Ffocale-local-relay/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/arcsecond-io","download_url":"https://codeload.github.com/arcsecond-io/focale-local-relay/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arcsecond-io%2Ffocale-local-relay/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35251017,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-08T02:00:06.796Z","response_time":61,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-07-08T04:01:10.457Z","updated_at":"2026-07-08T04:01:11.057Z","avatar_url":"https://github.com/arcsecond-io.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Focale\n\nFocale is a small desktop/CLI bootstrap for Focale users that:\n\n- logs in with the user's Focale account\n- creates and stores a local Hub agent identity\n- enrolls that identity with Focale when needed\n- mints a short-lived Hub JWT\n- connects to the Focale Hub using the signed Ed25519 challenge flow\n\nFocale owns its own local state and uses Focale password login to obtain a short-lived bearer JWT plus a refresh token.\n\n## User install\n\n### Python / terminal\n\n```bash\npip install focale-local-relay\n```\n\nThen:\n\n```bash\nfocale login\nfocale context list\nfocale context use personal\nfocale connect --hub-url wss://hub.focale.space/ws/agent\n```\n\n### Desktop GUI\n\n`python -m focale_local_relay` launches the PySide6 desktop app when no CLI arguments are given.\nThe existing `focale` console script remains available for terminal-driven workflows.\n\n### Windows installer\n\nThis repository includes a bootstrap for building a Windows installer from CI. The installer packages\nthe PySide6 desktop app as `focale-relay.exe`.\n\nSee:\n\n- [`.github/workflows/windows-production.yml`](.github/workflows/windows-production.yml)\n- [`.github/workflows/windows-staging.yml`](.github/workflows/windows-staging.yml)\n- [`packaging/windows/focale-relay.iss`](packaging/windows/focale-relay.iss)\n- [`scripts/build_windows.ps1`](scripts/build_windows.ps1)\n\n## Commands\n\n```bash\nfocale login\nfocale status\nfocale context show\nfocale context list\nfocale context use personal\nfocale context use my-observatory\nfocale doctor --hub-url wss://hub.focale.space/ws/agent\nfocale doctor --hub-url wss://hub.focale.space/ws/agent --json\nfocale connect --hub-url wss://hub.focale.space/ws/agent\nfocale --api-server https://api.focale.dev connect --hub-url wss://hub.focale.dev/ws/agent --once\nfocale connect --organisation my-observatory --hub-url wss://hub.focale.space/ws/agent\nfocale platesolver status\nfocale platesolver solve --peaks-file ./peaks.json\n```\n\n`focale connect` will automatically:\n\n1. refresh the Focale access JWT when needed\n2. create a local Ed25519 keypair if needed\n3. enroll a personal or organisation-scoped agent installation if needed\n4. mint a Hub JWT\n5. discover local ASCOM Remote (Alpaca) servers and register new ones in the selected context\n6. complete the Hub challenge-response handshake\n\nYou can set the default context once and keep connect/doctor simple:\n\n```bash\nfocale context use personal\n# or\nfocale context use my-observatory\n```\n\n## Plate solving\n\nPlate solving is included with `pip install focale-local-relay` — `arcsecond-astrometry`\nis a mandatory dependency and ships native binaries for Windows, macOS, and Linux with no Docker\nor external tooling required.\n\n```bash\nfocale platesolver status\nfocale platesolver solve --peaks-file ./peaks.json --scales 6\n```\n\nYou can also target a remote service:\n\n```bash\nfocale platesolver status --service-url http://127.0.0.1:8900\nfocale platesolver solve --service-url http://127.0.0.1:8900 --peaks-file ./peaks.json\n```\n\n## Development\n\n```bash\npython -m venv .venv\nsource .venv/bin/activate\npip install -e .[dev]\npytest -q\n```\n\n## Publishing\n\nThis repo includes:\n\n- a PEP 621 `pyproject.toml`\n- a CI workflow for tests\n- a PyPI publish workflow on tags such as `v0.2.0`\n- a Windows installer workflow that builds a PyInstaller bundle and wraps it with Inno Setup\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Farcsecond-io%2Ffocale-local-relay","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Farcsecond-io%2Ffocale-local-relay","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Farcsecond-io%2Ffocale-local-relay/lists"}