Skip to content

Version M1 V1.0.1

Choose a tag to compare

@RemArrow RemArrow released this 05 Aug 22:26
· 3 commits to main since this release
753990c

Changelog

All notable changes to OperatorPhone.

Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).


[1.0.1] — 2026-08-05

Navigation fix. If you got stuck in Settings, this is the one you want.

Fixed

  • Navigation could wedge on entering Settings. The Settings screen reads chat state,
    which forces the runtime to load Photon's assembly. When that assembly wasn't
    resolvable the throw happened mid-navigation, before the nav bar refreshed — leaving
    the back button hidden and no way out of the screen.
  • App lifecycle callbacks are now isolated, so a failure inside any one app can't take
    navigation down with it. A broken app is now a broken screen you can leave, rather
    than a phone you're trapped in.
  • Settings degrades gracefully when chat is unavailable, showing Chat: unavailable
    instead of throwing.
  • Unlinking no longer fails when the chat service can't be reached.

Added

  • Home button in the nav bar (). Previously only Back existed, so returning to
    the app grid from a nested screen took multiple presses.

[1.0.0] — 2026-08-05

First public release. Identity works end to end; messaging is present but unverified
between two players.

Added

Identity

  • Steam account linking via Steam OpenID, in the player's browser. No API key or App ID
    required, which is what makes this possible for a third-party mod at all — validating
    a Steam auth session ticket needs a publisher key only the game's developer can issue.
  • Persistent phone numbers in AAA-NNNN format. Area codes encode join cohort,
    starting at 201 and rolling over at 50% block occupancy.
  • Numbers derive from HMAC(steamid, secret), so the same account always converges to
    the same number — surviving reinstalls and even a database restore.
  • Atomic assignment: INSERT plus a UNIQUE constraint, linear-probing on collision.
    Uniqueness is enforced by the database rather than a read-then-write check, which
    would race two simultaneous logins onto one number.
  • Auth token cached locally, so only the first launch opens a browser.
  • Relink is forced automatically if the running Steam account differs from the linked
    one — on a shared machine, that prevents delivering someone else's messages.

Phone

  • Screen-space phone panel, toggled with F1.
  • Status bar showing your number and connection state, in tabular figures so digits
    don't jitter as they change.
  • App shell with home grid, nav bar, and back navigation.
  • Messages — thread list, new conversations by number, conversation view with
    aligned bubbles, composer.
  • Contacts — add with nickname, delete, persisted locally.
  • Settings — number, identity state, chat state, unlink.

Networking

  • Photon Chat transport, entirely separate from OPERATOR's Mirror netcode. The mod
    registers no prefabs, spawns no networked objects, and touches no NetworkServer
    so it can't desync a match or crash a server.
  • Messaging works outside matches and across different servers.
  • Photon custom authentication against the identity worker, so a client can't connect
    claiming a UserId it doesn't own.
  • Versioned message envelopes. Unknown types are ignored rather than throwing, so a
    newer client's message can't break an older one.
  • Local message history in append-only JSONL, one file per thread.

Input

  • Game input suppressed while the phone is open, with cursor state saved and restored.
  • Cursor lock reasserted each frame, since the game re-locks it from its own state
    machine.

Packaging

  • Ships as a single DLL. Photon's client assembly is embedded and resolved at load time
    via a module initializer, so nothing goes in UserLibs.

Known issues

  • Messaging is unverified between two accounts.
  • No offline delivery — messages to a disconnected player are lost.
  • Text entry untested mid-match. If typing moves your operator, that's the top-priority
    fix.
  • Long messages may lay out incorrectly in a conversation.
  • The phone is a screen-space panel, not a held object.

Privacy

  • SteamIDs are never stored server-side, only an irreversible HMAC.
  • Number lookup is one-directional: a number can receive messages but can't be resolved
    back to a Steam account.
  • Messages are not end-to-end encrypted and pass through Photon in transit.