Repository navigation
Feature Details
How each protection actually works, and why. See Configuration for where to find each toggle in the settings menu.
If you're interested in servers or plugins that use tracking-related exploits, see the Hall of Shame.
- Client Spoofer
- Spoof As Options
- Channel Spoofing
- Known-Pack Filtering
- Key Resolution Protection
- Meteor Fix
- Mod Whitelist
- Isolate Pack Cache
- Block Local URLs
- Bypass Server Pack Requirement
- Strip Mod Shader Overrides
- DPI Evasion (TLS Fragmentation)
- Block Cookies
- Client Information Normalizer
- Scrub Pack Download Headers
- Command History Guard
- Auto-Purge Pack Cache On Exit
- Lazy Server List Ping
- Chat Signing Control
- Chat Link/Command Guard
- Account Manager
- Telemetry Blocking
- Trusted Skin/Cape Texture Hosts
- Streamer Mode
- Game Connection Proxy
- Cloudflare Ping Relay
- ExploitPreventer Compatibility
Servers can query your client brand to detect whether you're running a modded client. OpSec provides true vanilla spoofing by blocking all mod key resolutions, network channels, and known-pack identifiers (while keeping vanilla ones).
- ON - Appear as an unmodified Minecraft client
- OFF - Appear as a standard Fabric/NeoForge client (default)
Set to OFF by default to allow auto mod whitelisting (whitelist mods with network channels, Fabric only).
While Client Spoofer is on, you can pick which brand string OpSec advertises instead of plain vanilla:
| Option | Brand sent | Channel behavior | Notes |
|---|---|---|---|
| Vanilla (default) | vanilla |
Identical to real vanilla | Always accurate, accepted by any server that allows vanilla clients at all |
| Lunar Client | lunarclient:v<version>,fabric |
Identical to vanilla mode (all mod channels blocked) | Lunar's own client uses this vanilla-like network behavior to pass anti-cheat brand checks. OpSec does not implement Lunar's proprietary cosmetics protocol behind the lunarclient:pm channel some server plugins also check for, so a server doing that specific check may still notice. The version suffix follows Lunar's own release-line scheme (v<lunar-version>-<year><week>, e.g. v2.22.1-2620 - not the Minecraft version) and is a point-in-time snapshot that will go stale as Lunar ships new builds; edit it from Configure Lunar Version... next to the Spoof As dropdown, which also keeps a history of recently-used values to pick from instead of hand-editing opsec.json
|
| Badlion Client | badlion |
Identical to vanilla mode (all mod channels blocked) | Badlion doesn't register its own plugin channels either, and its brand pattern has no version component, so this option can't go stale the way Lunar's can |
Why these and not others: every option here only changes the outbound brand string - the underlying channel/known-pack/key-resolution behavior is always identical to plain vanilla mode, because that's what these two clients are documented to actually do on the wire (see AntiSpoof's brand-pattern config and lunarclient.dev/client-brand). Getting this wrong - advertising a brand a server can then contradict via a follow-up check - is worse than not spoofing at all, so OpSec deliberately does not invent channel registrations or protocol responses it can't actually back up. These options only help against a server that denies the generic vanilla brand but allowlists specific "known" clients by name; that's an uncommon configuration, so Vanilla remains the safer default for most servers.
Servers can query your registered network channels to detect which mods you have installed.
OpSec can conditionally block mod channels that are registered with the server to prevent detection. Enabled by default; behavior is controlled by the Mod Whitelist.
Servers can probe your mod-injected pack identifiers that certain mods expose to detect whether you're running a modded client or using certain mods. OpSec intercepts the outgoing ServerboundSelectKnownPacks response and strips entries belonging to non-whitelisted mods. Real vanilla and auto-whitelisted packs still pass through.
- ON (Client Spoofer): Strips all mod-injected packs.
- OFF: Keeps packs for whitelisted mods, strips the rest.
Only active on clients where Fabric's known-packs hook is present (MC 1.21.11+ with modern fabric-api). See Known Issues for the NeoForge status.
Servers can send translatable text containing keys like key.attack or key.hide_icons in any server packet to probe which keys you have bound or which mod UI elements your client can resolve. This can reveal the client's installed mods. Background: wurst.wiki/sign_translation_vulnerability.
OpSec tracks when translation keys are being resolved during server packet processing and blocks Minecraft from resolving them based on your selected brand mode:
- ON (Client Spoofer): Blocks all mod keys, returns default keybind values for vanilla keys
- OFF: Allows Fabric API and whitelisted mod keys, blocks everything else
When Fake Default Keybinds is disabled, vanilla keybinds resolve to their actual values.
Example - spoofing mod keybinds (returns raw key/fallback instead of the real keybind value):
[key.meteor-client.open-commands] '.'→'key.meteor-client.open-commands'
[key.meteor-client.open-gui] 'Right Shift'→'key.meteor-client.open-gui'
Example - spoofing vanilla keybinds with Fake Default Keybinds enabled (returns default keybinds):
[key.hotbar.6] 'Q'→'6'
[key.hotbar.7] 'E'→'7'
[key.hotbar.8] 'R'→'8'
Legacy Meteor Client ships a built-in key-resolution protection that can lead to guaranteed detection under key resolution probing: the server can use a specially crafted translation-key probe with a fallback value, expecting the fallback value back instead of the raw key. Meteor Client echoes the raw key back instead.
When the server uses a sign exploit with a fallback value on Meteor Client:
'key.meteor-client.open-gui' 'Right Shift'→'key.meteor-client.open-gui'
What a vanilla response would actually be:
'key.meteor-client.open-gui' '⟦FALLBACK⟧'→'⟦FALLBACK⟧'
OpSec's fix is to blacklist the AbstractSignEditScreenMixin Mixin to disable Meteor's broken key resolution protection, letting OpSec's own protection (which already handles fallbacks correctly) take over.
Some mods require server communication to function properly (e.g. VoiceChat, Xaero's Minimap quick travel). The whitelist lets you exempt specific mods from channel spoofing, key resolution protection, known-pack filtering, and shader override stripping.
Modes:
- OFF: All mod content is blocked
- AUTO (default, Fabric only): Mods that register network channels are automatically whitelisted, since they're the most likely to have server-side functionality
- CUSTOM: Manually select which mods to whitelist from the installed mod list
CUSTOM mode lists every installed mod so any mod can be whitelisted; AUTO mode only shows mods that register network channels.
AUTO mode is Fabric-only. NeoForge builds only offer BLOCK ALL and CUSTOM — see Known Issues.
Based on LiquidBounce.
Server-required resource packs can be used to fingerprint a client instance across accounts (background: alaggydev.github.io/posts/cytooxien). Instead of storing all resource packs in a shared cache (~/.minecraft/downloads/), OpSec creates separate cache directories per account UUID (and per-server, extending the isolation further - closing a side-channel where two colluding servers could share a resource-pack push ID to detect a returning player across servers even without sharing an account).
Derived from ExploitPreventer by NikOverFlow.
Malicious servers can send resource pack URLs that redirect to your local network to probe for local devices and services (background: alaggydev.github.io/posts/cytooxien). OpSec checks if a redirect or normal request targets a local address, then blocks the connection.
Servers can push required resource packs the client is forced to apply. Declining them, or toggling a required server resource pack, is impossible on a vanilla client - and faking acceptance can be detectable via key-resolution probing of the client's resource-pack key response.
Minecraft still accepts and downloads these packs as normal, but OpSec lets you toggle the pack textures at the client level. The language file of the server resource pack is preserved, since servers can probe translation keys (e.g. {"translate": "some.pack.key"}) to detect whether the pack is actually applied, and a vanilla client with the pack loaded would resolve those keys to the pack-defined value.
With OpSec installed, the server resource pack appears as a normal user-toggleable entry in the resource pack menu so you can flip between stripped and fully-loaded.
Modes:
- MANUAL (default): Required packs apply fully like vanilla on push. Optional packs follow vanilla toggle semantics. You can still unequip any server pack to strip it while keeping lang loaded.
-
ASK: Required packs are stripped on push and a consent overlay prompts
[Continue]/[Load Pack For Real]. - ALWAYS ON: All server packs are stripped on push, no overlay. You can still toggle them back.
Some mods (e.g. Meteor Client) render their GUI with their own shaders loaded through Minecraft's resource manager. A forced server resource pack can override the mod's own files to ship shaders under that mod, either blanking the mod's GUI, crashing the client with malformed shaders, or GPU-DoS-ing it - which also fingerprints that the mod is installed.
OpSec strips shader overrides under assets/<mod>/shaders/ from server packs for any installed mod that isn't whitelisted, so the resource manager falls back to the mod's own bundled shaders. The rest of the pack still loads, so this keeps working even when a server forces the pack in a way that makes Bypass Server Pack Requirement unusable.
Vanilla (minecraft) shaders are never touched, and whitelisting a mod lets the server's shader override through.
Splits the TLS ClientHello of the mod's own background HTTPS requests (GitHub update check, jar integrity check) across two TCP segments instead of one, so a DPI middlebox that only inspects the first segment for the plaintext SNI hostname doesn't see the full hostname to filter on. Same idea used by zapret, GoodbyeDPI, and ByeDPI, which are the right tools if the game connection itself is being blocked.
Off by default - enable it if you're in a region where these background checks are timing out or failing.
What it covers: only requests made via OpSec's internal DpiEvasion helper - currently the GitHub update check and jar integrity check.
What it does not cover, and why:
-
Microsoft/Xbox/Minecraft-services login (
SessionAccount) - that path usesjava.net.http.HttpClient, whose async engine talks to raw sockets viaSSLEnginedirectly and never goes through aSSLSocketFactory, so there's no public API hook to fragment its handshake. If login itself is blocked in your region, run a system-level tool alongside the game. - The actual Minecraft server connection - that's a raw TCP socket carrying the Minecraft protocol, not TLS. There's no ClientHello to fragment.
- IP-based blocking in general - fragmentation only defeats DPI that inspects the SNI field. If the destination IP is null-routed or reset regardless of packet contents, this does nothing.
MC 1.20.5+ lets a server send ClientboundStoreCookiePacket to persist an opaque blob on the client, which the server (or a colluding one) can request back later via ClientboundCookieRequestPacket - including across reconnects and Transfer hops. That's a ready-made cross-session, cross-server tracker that doesn't depend on your account or IP at all.
OpSec cancels handleStoreCookie outright when this is on, so no cookie is ever stored. A subsequent request for it gets vanilla's normal "never set" response - indistinguishable from a client that was never sent one.
On by default (MC 1.20.5+ only; the packet doesn't exist on older versions).
Every client sends a ClientInformation packet on join (language, view distance, chat visibility, chat colors, skin-layer bitmask, main hand, text filtering, server-listing opt-in). That combination of settings is itself a fingerprint.
When enabled, OpSec replaces the entire outgoing ClientInformation with a common baseline (en_us, chat FULL, all skin layers on, text filtering off, listing on) instead of whatever you actually have configured. These are vanilla's real fresh-install defaults, not the internal fallback (which reports an unrealistic view distance and no skin layers - standing out more than reporting nothing). View distance and main hand are picked once per game launch from realistic weighted distributions (view distance mostly 10, occasionally 8/12/16; main hand ~90% right / ~10% left) instead of one fixed value for every install - a single universal combination is itself a cross-user fingerprint.
On by default - this only changes what the server sees, not your actual client settings or language. The one visible trade-off is the server's view of your chat visibility/settings not matching reality (mainly chat visibility - no gameplay-breaking effect either way).
Decompiling vanilla's DownloadedPackSource shows it attaches X-Minecraft-Username, X-Minecraft-UUID, X-Minecraft-Version, X-Minecraft-Version-ID, X-Minecraft-Pack-Format, and a version-specific User-Agent to every server resource pack download request. The pack host sees all of this - including a third-party CDN that isn't the game server itself.
OpSec replaces the strictly-identifying ones (X-Minecraft-Username, X-Minecraft-UUID, User-Agent) with a neutral placeholder before the request goes out. Version/Version-ID/Pack-Format are left alone - they aren't personally identifying on their own, and some pack CDNs may use them to serve the correct pack file.
On by default (MC 1.20.3+, when the multi-pack download system was introduced).
Minecraft's CommandHistory persists what you type in chat/commands to command_history.txt for arrow-key recall - including /login <password>, /register <password>, and similar auth-plugin commands, stored in plaintext exactly as typed.
OpSec redacts the arguments of /login, /l, /register, /reg, /changepassword, /changepw, /cpw, /premium, /2fa, and /authme before they reach the history list or the file - the command name is kept, only the password/argument text is replaced.
On by default (MC 1.20.2+, when CommandHistory was introduced).
Isolate Pack Cache buckets downloaded packs per account (and per server), but an isolated cache is still an artifact sitting on disk between sessions. When enabled, OpSec wipes downloads/ and server-resource-packs/ on client shutdown, reusing the same cache-clearing logic as the manual Clear Cache button.
Off by default - packs simply re-download next time you connect.
Opening the multiplayer screen makes Minecraft automatically ping every saved server to fetch its MOTD/player count/icon - each ping is a real connection attempt (and IP disclosure) to a server you haven't chosen to join yet, just from opening the menu.
OpSec cancels ServerStatusPinger.pingServer when this is on, so no automatic pings happen; a saved server shows no preview until you actually connect (joining doesn't need the ping data, so there's no effect on connecting).
Off by default.
Based on No Chat Reports. Cryptographic signatures are attached to every chat message by default. Removing them makes it impossible to track and associate your chat messages with your Minecraft client and, by extension, your Microsoft account.
Modes:
- OFF: Strip all chat signatures (maximum privacy), but prevents chatting on servers that enforce secure chat.
- AUTO: Only sign when the server enforces secure chat.
- ON: Default Minecraft behavior, signs every message.
Requires confirmation before a clicked chat/sign/book message copies to your clipboard or runs a command (vanilla does both instantly, unlike OPEN_URL), plus an extra heads-up before opening links shaped like phishing/IP-grabber patterns (raw IP, punycode, look-alike characters).
Based on Meteor Client. Add Minecraft accounts with session tokens and switch between them without restarting the game.
- Session Token Login - add accounts using access tokens
- Refresh Token - fetch new session tokens for expired accounts
- Offline Account - add username-only accounts without authentication
- Account Switching - click an account to log in, click again to log out to the original account
- Token Validation - refresh to check if tokens are still valid (expired tokens marked red)
- Import/Export - backup and restore accounts via JSON files
Session tokens expire after some time. Use the Refresh button to check validity.
OpSec Enhanced additions on top of this: saved session/refresh tokens are AES-256-GCM encrypted at rest instead of stored as plaintext, with an owner-only-permissioned key file; and a Skin/Cape Correlation Alert warns when two saved accounts share the same active skin or cape texture, since that's a real way to link a "main" and an "alt" together.
From No Chat Reports. Minecraft collects and sends telemetry data to Mojang, including game events and player actions, performance metrics, client configuration, and usage statistics. OpSec blocks telemetry sending to Mojang when enabled. Does not affect gameplay.
A malicious server can push a player-list entry, a skull block, or (MC 26.x) a Mannequin NPC whose skin/cape texture URL points anywhere — not just Mojang's own CDN. The client fetches that URL the moment it tries to render the texture, with no interaction required, leaking your IP to whatever host the URL names. See #12/#13/#14.
OpSec rejects any skin/cape texture fetch whose URL doesn't point at textures.minecraft.net, unless the texture is already cached locally (a cache hit never touches the network, so it's always allowed regardless of host). On by default, no setting — this is a straightforward security fix with no privacy/functionality trade-off.
Purely visual, on-screen redaction for content creators — it doesn't change anything sent to the server (that's already covered by the rest of the mod), only what's rendered on your own screen. Off by default, enable from the Misc tab.
-
Hide Coordinates — Replaces the F3 debug overlay's position group (world XYZ, block/chunk position, facing) with a placeholder. MC 1.21.11+ only — see Known Issues. Doesn't cover third-party debug-HUD mods (e.g. BetterF3) that read your position independently of vanilla's F3 overlay rather than through it — closing that would mean redacting raw text as it's drawn regardless of source, which risks false-positively blanking unrelated debug lines (FPS, memory, etc.), so it isn't attempted here.
-
Mask Player Names — Replaces every player's above-head nametag and tab-list entry with a placeholder, including your own. Two styles:
-
Hidden — fixed
Playerplaceholder - Glyphs — pseudo-random CJK-style characters that rotate every few seconds, the same look as Hypixel's own nick-disguise, so a viewer can't read a stable fake name off a clip and treat it as an identity
Hooks the same
PlayerInfo.getTabListDisplayName()field vanilla's own tab list checks before falling back to the raw profile name — third-party tab-list replacements (BetterTab and similar) read this exact field too, so the mask applies there as well, not just to vanilla's own rendering. Doesn't yet cover names baked into chat message text. -
Hidden — fixed
Routes the actual multiplayer connection — not just this mod's own outbound HTTP calls, which already thread a Proxy through — via a SOCKS5 or HTTP proxy you configure. See #11.
Connection.connect(...) builds its own raw Netty Bootstrap, bypassing java.net's proxy selector entirely, so JVM flags like -DsocksProxyHost have zero effect on it. Minecraft's bundled netty-handler jar also excludes io.netty.handler.proxy.*, so both handshakes (SOCKS5 per RFC 1928/1929, and HTTP CONNECT) are implemented from scratch rather than relying on Netty's own proxy support. Vanilla's own pipeline construction, compression setup, and worker-group selection are left completely untouched — only the actual TCP dial target is swapped to the proxy, with the handshake handler prepended to the pipeline to tunnel to the real server transparently.
Off by default — this is a real behavior change to the connection itself, not a passive redaction. Enable from the Protection tab (Game Connection Proxy: Off / SOCKS5 / HTTP), then Configure Proxy... for host/port/credentials.
An optional backend for Lazy Server List Ping. Instead of just skipping the automatic ping (and losing the MOTD/player-count preview for every saved server), this fetches the same status through a Cloudflare Worker you deploy yourself — the worker does the raw TCP server-list-ping handshake on your behalf and hands back only the parsed status JSON, so the target server never sees your real IP during the ping. See #15.
This is entirely optional and requires deploying your own worker — see Cloudflare Ping Relay Setup for the step-by-step guide. Nobody but you runs the copy you deploy.
Requires MC 1.20.6+ — see Known Issues. Enable Lazy Server List Ping first, then Cloudflare Ping Relay, then Configure Ping Relay... for your worker's URL.
For users who prefer ExploitPreventer's core protection implementation but still want OpSec's additional features, both can be installed alongside each other. Overlapping features are automatically disabled to let EP handle them - note you'd lose OpSec features such as channel spoofing. The following OpSec features are deferred to EP:
- Brand Spoofing
- Channel Spoofing
- Known-Pack Filtering
- Isolate Pack Cache
- Block Local URLs
- Key Resolution Protection
- Mod Whitelist
These settings are grayed out in the config screen but your saved preferences are preserved. If you remove EP later, they restore automatically.
Features that don't overlap remain fully functional: alerts, chat signing, account manager, telemetry blocking, Strip Mod Shader Overrides, and Meteor Fix.