Version M1 V1.0.1
·
3 commits
to main
since this release
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-NNNNformat. Area codes encode join cohort,
starting at201and 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:
INSERTplus aUNIQUEconstraint, 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 noNetworkServer—
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 inUserLibs.
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.