Operator console
every section, in order.
AXIS has no separate admin app. Its controls live inside the terminal of your passcode build: Account → Operator console. This page walks through each section from top to bottom, and explains what the console can and cannot reach.
01Open it, and know what it reaches
The console is for whoever runs the build, so it is not in a build until you put it there. Build with your own passcode:
flutter build apk --release --dart-define=AXIS_OPERATOR_PASSCODE=your-own-passcode
Then open the Account tab → section TERMINAL → Operator console, and enter that passcode (lib/features/admin/operator_console_screen.dart, gate in lib/core/config/operator_access.dart).


Values saved here are stored on this device only and outrank your published config on that device. They do not reach your users. To configure every copy of your build, publish the same keys in config.json or Firebase (how).
A build without AXIS_OPERATOR_PASSCODE has no operator console: the Operator console entry is not listed and no screen reaches it. That is the build you publish to end users — they cannot change the network, the open surfaces or your builder fee. Build your own copy with the passcode when you want the console on your own device, and keep that passcode to yourself (at least six characters; a shorter one is treated as none). The unlock lasts for that run of the app only and is never stored, so closing the app locks it again. It is a gate on a local screen, not a key to funds — the signing key stays behind the vault and the app lock. The passcode is compiled into that build and can be read out of it, which is one more reason to keep the passcode build on your own devices. Values the console stores are read only by a passcode build: a build without one ignores anything stored on the device and runs on your published configuration.
02What you can change without code
Everything in this table is a setting: try it in the console on your device, then publish the same key in your config.json (or Firebase) so every user gets it. No rebuild, no programming. Changes reach users at their next app start.
| You want to change | Console field | Config key |
|---|---|---|
| Allow or stop new trades | Surfaces → HYPERLIQUID PERPS | hyperliquid_perps_enabled |
| Show or hide stock / commodity markets | Surfaces → STOCK / COMMODITY DEX | stocks_enabled |
| Your builder fee: on/off, address, rates | Earning — builder fee | builder_fee_enabled, builder_address, builder_fee_tenths_bps, builder_fee_stock_tenths_bps |
| App name in the window title and About screen | Branding → APP NAME | app_name |
| Accent colour | Branding → ACCENT COLOUR | primary_color |
| Tagline on the About screen | Branding → TAGLINE | tagline |
| Support email, support page, website | Support | support_email, support_url, website |
| WalletConnect on/off and project ID | Surfaces → WALLETCONNECT, Integrations | walletconnect_enabled, walletconnect_project_id |
| Maintenance screen and its message | Availability | maintenance_mode, maintenance_message |
| Force older installs to update | Availability → MINIMUM APP VERSION | min_app_version |
| Mainnet or testnet, on one device | Network | none: a published config cannot change it; the build's starting network is HYPERLIQUID_NETWORK |
What needs a rebuild
These are compiled into the app. Change them in the files named, then build and publish a new version (Deployment). Users get them when they update.
| Change | Where |
|---|---|
| Product name in the header mark, store name, home-screen name | lib/core/config/axis_identity.dart (kAxisAppName), lib/screens/axis_chrome.dart, platform files (list) |
| App ID / bundle ID | android/app/build.gradle.kts, the Xcode project, kAxisApplicationId (list) |
| App icon, favicon, header logo | assets/images/ and dart run flutter_launcher_icons (how) |
| Full colour palette and fonts (beyond the accent) | lib/ui_kit/axis_tokens.dart, assets/fonts/ |
| Website, icon URL, support email fallback, privacy / terms / risk links, the config file address | lib/core/config/axis_identity.dart |
| Firebase project | flutterfire configure (how) |
| Network a build starts on, Reown ID as a build setting, store links | --dart-define values (list) |
| Default Arbitrum RPC endpoints for everyone | lib/core/chains.dart |
03Network
MAINNET / TESTNET. Switching asks for confirmation, then changes every endpoint the terminal talks to, and discards the other network's markets, prices and positions. The rows underneath show the live values: info endpoint, exchange endpoint, WebSocket, deposit bridge and signing chain.
The choice is stored on this device only. The build's starting network comes from HYPERLIQUID_NETWORK (default mainnet).
04Surfaces
Switches take effect immediately.
| Switch | Key | Effect |
|---|---|---|
| HYPERLIQUID PERPS | hyperliquid_perps_enabled | Off (the default) refuses new positions and transfers to the stock dex. Closing positions and withdrawing always stay available, so users are never trapped. |
| STOCK / COMMODITY DEX | stocks_enabled | The builder-deployed xyz markets (for example TSLA, GOLD). |
| WALLETCONNECT | walletconnect_enabled | Off shows a disabled message on the WalletConnect screen. |
05Earning — builder fee

| Field | Rule |
|---|---|
| BUILDER FEE | Master switch. Off attaches no builder code to any order. |
| BUILDER ADDRESS | 0x + 40 hex characters, not the zero address. Must hold at least 100 USDC of Hyperliquid perps collateral before the venue pays it. |
| PERPS FEE (TENTHS OF A BASIS POINT) | 1 to 100. 10 = 1 bp = 0.01 %. 100 = 0.1 %, the protocol cap. |
| STOCK DEX FEE (TENTHS OF A BASIS POINT) | Same units, xyz markets only. 0 = charge the perps fee there too. |
Out-of-range values are rejected at the field with the reason. Full setup: Setting up earnings.
06Branding
- APP NAME (
app_name): window title and About screen. The header mark text is set in code (Rebranding). - ACCENT COLOUR (
primary_color):#RRGGBB; repaints the accent on the next frame. - TAGLINE (
tagline): About screen.
07Support
SUPPORT EMAIL, SUPPORT URL and WEBSITE. Used by the Support and About screens. The email must be a valid address and the URLs valid links, or the field refuses them.
08Integrations
WALLETCONNECT PROJECT ID (walletconnect_project_id) from cloud.reown.com. Without one, dApp connections are unavailable and the WalletConnect screen says so. You can also compile it in with REOWN_PROJECT_ID.
09Availability
- MAINTENANCE MODE: replaces the whole app with the maintenance screen at the next config apply. Check the message first.
- MAINTENANCE MESSAGE: the text on that screen.
- MINIMUM APP VERSION: for example
1.2.0. Installed versions below it are asked to update, usingAPP_STORE_URL/PLAY_STORE_URL. Empty disables the check.
Setting maintenance mode in the console on your own device locks your device into the maintenance screen. Use it through your published config, and keep a way to publish the change back.
10Effective configuration
The merged result the app is running on, key by key, each tagged OPERATOR, REMOTE CONFIG or BUILT-IN DEFAULT. It lists only the keys AXIS acts on (Configuration, runtime settings); keys the config model still parses from the wallet engine AXIS grew from are left out. COPY AS JSON copies exactly that list to the clipboard: a quick way to produce your config.json.
CLEAR next to a field returns it to the remote value, or to the built-in default. RESET ALL (top right) clears every operator value on this device, including the builder address and fee.
11The Earnings tab (status)
The status page of your setup, and read-only: routing, this wallet's on-chain approval, your rate against the cap, the builder address balance, orders that went out without the fee, and the protocol prerequisites. Press RECHECK to read everything again from Hyperliquid.

It is described line by line in Earnings → The Earnings screen.