Releases: RemArrow/Operator-Phone-Mod
Release list
VERSION M2 1.0.3
[1.0.3] — 2026-08-05
Message bubbles were being cut off at both edges of the screen.
Fixed
- Bubbles rendered outside the phone's bounds, clipping text on the left and right
simultaneously. Two causes: every bubble was forced to a fixed width regardless of how
short the message was, and the conversation list's content was anchored from its
centre — so anything wider than the view spilled equally past both sides instead of
being contained. - Bubbles are now sized to their text, up to a maximum width, so short messages get
short bubbles and the alignment between sent and received is actually readable. - Text wrapping now matches the bubble's real width, fixing bubbles whose height didn't
match the text inside them.
Version M2 1.0.2
[1.0.2] — 2026-08-05
Chat now connects. Previous builds shipped without Photon's client assembly embedded,
so messaging could never start.
Fixed
- Photon's client assembly wasn't being embedded, so every attempt to use chat threw
FileNotFoundExceptionand messaging was unreachable. It's now bundled inside the mod
DLL and resolved at load time. - The chat fault guard never armed, producing an identical exception every frame —
thousands of lines that buried anything else in the log. The failure is a type-load
error raised while JIT-compiling the method that touches chat, so atry/catchinside
that same method could never catch it. The guard moved to the caller, with the chat
reference isolated behind a no-inline boundary. - Opening Settings could wedge navigation. Reading chat state forces Photon's
assembly to load; when that failed, the throw happened mid-navigation before the nav
bar refreshed, hiding the back button with no way out of the screen. - App lifecycle callbacks are isolated, so a failure in any one app can no longer break
navigation for the whole phone. - Settings degrades to
Chat: unavailableinstead of throwing. - Unlinking no longer fails when the chat service is unreachable.
Added
- Home button (
⌂) in the nav bar. Previously only Back existed, so returning to the
app grid from a nested screen took several presses. - Startup diagnostic listing embedded resources, so a missing dependency is reported at
load with the actual cause rather than surfacing later as an opaque
FileNotFoundException.
Notes
- Chat connects and authenticates, but message delivery between two players is still
unverified. - Both players need the mod and must have linked at least once. Numbers that have never
been claimed can't be messaged. - Still no offline delivery — if the recipient isn't connected, the message is lost.
Version M1 V1.0.1
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.
Version M1
v1.0.0 M1 — Identity
First release. You can link your Steam account and get a phone number that persists
across restarts and reinstalls.
This is a foundation release. Messaging is implemented but not yet verified between
two accounts — treat it as untested. Nothing else is here to use yet.
What works
- Link once, keep your number. Steam login in your browser assigns a number like
201-9219. Stored locally, so every launch after that goes straight to the phone with
no browser trip. - The phone opens. Press
F1. Status bar shows your number and connection state. - Home, Messages, Contacts, Settings exist and navigate.
- Game input is suppressed while the phone is open, so you don't walk into a wall
reading a text.
What doesn't
- Messaging is unverified. The send path is written and persists locally, but no
message has been confirmed delivered between two players yet. - No offline delivery. If the recipient isn't connected, the message is lost.
- No images, links, presence, or group threads.
- No moderation tooling. Don't hand this to strangers.
Install
- [MelonLoader](https://melonwiki.xyz/) v0.6+ installed into OPERATOR
- Drop
OperatorPhone.dllintoOPERATOR/Mods/ - Launch, press
F1, click Link Steam Account
Single DLL. Nothing goes in UserLibs.
Notes
- Requires Steam — the mod authenticates through Steam OpenID.
- Your SteamID is never stored on the server, only an irreversible hash of it.
- Messages are not end-to-end encrypted. Treat the phone like an unencrypted chat.
- Numbers can't currently be transferred or rerolled from the UI. Since assignment is
derived from your account, unlinking and relinking returns the same number. - Tested against OPERATOR
0.09.5/ Unity6000.3.8f1. Game updates may break it.
Known issues
- Text entry hasn't been tested mid-match. If typing moves your operator, close the
phone and report it — that's the top-priority fix. - Long messages may lay out incorrectly in the conversation view.
- The phone renders as a screen-space panel, not a held object. That's next.
Feedback
Bug reports welcome — include your MelonLoader/Latest.log, it makes almost every
problem diagnosable in one pass.
Full changelog: first release.