{"id":51145686,"url":"https://github.com/sproctor/mud-mobile-connector","last_synced_at":"2026-06-26T02:30:50.696Z","repository":{"id":366378823,"uuid":"1276044517","full_name":"sproctor/mud-mobile-connector","owner":"sproctor","description":null,"archived":false,"fork":false,"pushed_at":"2026-06-21T15:55:44.000Z","size":77,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-21T16:06:47.661Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sproctor.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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-06-21T13:24:56.000Z","updated_at":"2026-06-21T15:45:49.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/sproctor/mud-mobile-connector","commit_stats":null,"previous_names":["sproctor/mud-mobile-connector"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/sproctor/mud-mobile-connector","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sproctor%2Fmud-mobile-connector","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sproctor%2Fmud-mobile-connector/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sproctor%2Fmud-mobile-connector/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sproctor%2Fmud-mobile-connector/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sproctor","download_url":"https://codeload.github.com/sproctor/mud-mobile-connector/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sproctor%2Fmud-mobile-connector/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34801014,"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-06-26T02:00:06.560Z","response_time":106,"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-06-26T02:30:49.881Z","updated_at":"2026-06-26T02:30:50.688Z","avatar_url":"https://github.com/sproctor.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# MUD Mobile Connector\n\nA small, cross-platform desktop launcher that routes Simutronics play (GemStone IV /\nDragonRealms) through [MUD Mobile](https://mudmobile.com)'s hosted-Lich service, then\nhands a `.sal` launch file to the front end of your choice (Wrayth/StormFront, Warlock,\nGenie, Mudlet, Wizard, …).\n\nThe play.net **password and game key never leave your machine**: the SGE login runs\nlocally and MUD Mobile only ever receives `sha256(key)`.\n\n## How it works\n\n1. Paste your MUD Mobile **device token** (`wlk_…`) once — stored in your OS keychain.\n2. `GET /api/characters` lists your saved characters (or use **New connection** to log in\n   with account + password and discover them via SGE, saving them back).\n3. Pick a character + a front end. The first time you launch an account you enter its\n   play.net password; it's saved to the OS keychain and reused after that. If a stored\n   password ever fails SGE, the bad one is forgotten and you're prompted to re-enter it.\n4. The app runs the **SGE/EAccess** handshake locally (`eaccess.play.net:7910`, TLS) →\n   `{gamehost, gameport, key}`.\n5. `POST /api/sessions` with `keyHash = sha256(key)` → a router endpoint + session id.\n6. The app **waits for the runner to become functional**, polling `GET /api/sessions/{id}`\n   and reporting live status as it boots (bounded by a ~2-minute timeout, after which it\n   launches anyway since the router holds the connection).\n7. A `.sal` is written locally (real `KEY` kept; `GAMEHOST`/`GAMEPORT` rewritten to the\n   router on the **plaintext port 7000**) and the chosen front end is launched against the\n   ready runner.\n8. The launcher is fire-and-forget: after spawning the front end it exits the launch flow.\n   The hosted runner stays up idle, and MUD Mobile auto-routes the next connection back to\n   that same idle runner (no client-side session teardown).\n\n## Build \u0026 run\n\n```sh\ncargo run               # debug\ncargo build --release   # optimized, ~7 MB stripped binary at target/release/mudmobile-connector\ncargo test              # 26 unit/integration tests, no network required\n```\n\nLinux runtime needs OpenSSL (for TLS) and, for the keychain, a running Secret Service\n(gnome-keyring / KWallet). Windows/macOS use the OS-native TLS + credential stores.\n\n## Configuration\n\nConfig lives at the per-OS path (Linux: `~/.config/mudmobile-connector/config.toml`)\nand holds the **editable front-end list** plus preferences. Edit it in **Settings**, or by\nhand. The device token and per-account play.net passwords are in the OS keychain, never in config.\n\nEach front end has a `command_template` where `%1` is replaced with the `.sal` path, an\nexecutable path per OS, an optional `.sal` field override (e.g. Wizard → `GAME=WIZ`), and\na `protocol` (`storm`/`wiz`).\n\n\u003e **Note:** the hosted Lich serves a **Stormfront** stream, so Stormfront-protocol front\n\u003e ends are expected. The bundled **Wizard** entry uses the older WIZ protocol and may not\n\u003e be compatible — the UI warns when it's selected.\n\n## Design notes\n\n- **Stack:** Rust + egui/eframe (native GUI, no webview/JRE → small self-contained binary).\n- **Networking:** blocking `ureq` (HTTPS) + `native-tls` for both HTTPS and the SGE socket\n  (single TLS stack, OS-native, no bundled crypto). SGE uses TLS by default. The certificate is\n  accepted if it's **either** the bundled `assets/simu.pem` (the Warlock-sourced self-signed\n  Simutronics cert, matched by pinning) **or** valid for a public CA — so the login keeps working\n  if Simutronics ever moves to a normally-trusted certificate, while anything else aborts before a\n  password is sent (there is no encrypted-but-unverified mode). TLS can be turned off entirely in\n  Settings (plaintext socket, e.g. for a test server), and a failed TLS connection offers a\n  one-off **retry over plaintext**.\n- **Concurrency:** all blocking work runs on one worker thread (`worker.rs`); the egui UI\n  only drains events and renders. The worker calls `request_repaint()` to wake the UI.\n- **Connection model:** plaintext-direct (the front end connects straight to the router on\n  port 7000). A local TLS-proxy mode could be added later, isolated to `sal.rs`/`worker.rs`.\n\n### Module map\n`sge.rs` SGE/EAccess handshake · `mudmobile.rs` HTTP API client · `sal.rs` `.sal` build/parse ·\n`frontends.rs` registry + spawn · `config.rs`/`keychain.rs` persistence · `worker.rs`\nbackground thread · `app.rs` egui UI/state machine · `model.rs`/`error.rs` shared types.\n\n## Status / follow-ups\n\n- Plaintext-only connection model; TLS-proxy mode not yet implemented.\n- SGE socket uses a single read per response (like Lich's `sysread`); add grace-period\n  coalescing if a response ever arrives split across TCP segments.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsproctor%2Fmud-mobile-connector","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsproctor%2Fmud-mobile-connector","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsproctor%2Fmud-mobile-connector/lists"}