OUTRIDER docs
v1.1.0
Live demo Get help
● Start · /admin

Operator console
owner, team, settings.

The console at /admin is where you sign in, invite your team, change the desk's main settings, store keys and read the audit log. It is built on the MIKODES Admin Kit and runs inside the desk's own server.

01Create the owner account

  1. Set a setup tokenPut a long random value in .env: ADMIN_SETUP_TOKEN= followed by the output of openssl rand -hex 24 (at least 24 characters). Only someone who can read the server's environment knows it.
  2. Start the deskAfter npm run build (once), run npm start (or npm run dash). The terminal prints:
    [admin] No owner account yet. Open /admin and create it with the setup token from ADMIN_SETUP_TOKEN.
  3. Open the consoleGo to http://127.0.0.1:8790/admin on the same machine.
  4. Create the ownerEnter the setup token, your email and a password of at least 12 characters. You are signed in as owner, and from then on nobody can create an owner again. Remove ADMIN_SETUP_TOKEN from .env.
  5. Finish setupThe console walks you through the setup fields (mode, product name, accent colour). Anything you skip can be changed later.
No token set?

Without ADMIN_SETUP_TOKEN, every start before the owner exists prints a one-time setup code to the terminal instead, and the console asks for that code. Any printed code works until the owner is created. Without the token or a code, creating the owner is refused.

Before the owner exists

The dashboard answers only requests made on the machine itself (a loopback address such as 127.0.0.1), so create the owner there or through an SSH tunnel. /admin stays reachable, and creating the owner needs the setup token (or a printed setup code). After the owner exists, every dashboard page and API needs a console session: the dashboard sends you to /admin/ to sign in.

Create the owner dialog: setup token, e-mail and password
The first screen at /admin. It asks for the setup token from the server environment; the token is never sent anywhere by the server.

02Team and roles

RoleCan
viewerSign in and watch: the dashboard, settings, health, history and audit log. Viewers cannot change settings or use the kill switch.
managerEverything a viewer can, plus: change settings, engage and release the kill switch, test keys, see the team list.
ownerEverything, plus: add and remove members, change roles, set or replace secret keys, roll back to an older settings version, export and import settings. The last owner cannot be demoted.

An owner adds a member in Team with an email and a role. The console shows a one-time password for that member once; send it to them over a private channel. They change it after signing in.

03Sign-in security

  • Two-factor. Every member can turn on an authenticator app (TOTP) in Account. You get 8 one-time recovery codes; keep them offline. The owner can require two-factor for owners and managers in the kit settings; members without it are then asked to enrol before they can act.
  • Lockout. After 5 failed sign-ins within 15 minutes, that account waits before it can try again.
  • Sessions. A session lasts 12 hours. You can see your sessions and sign them out, one by one or all at once. The cookie is HttpOnly, SameSite=Strict, and Secure when the console is reached over HTTPS.
  • Password change signs out your other sessions.

04Settings sections

Console Desk settings page: Mode set to Paper trading, paper bankroll 10 SOL, max open memecoin positions 5, daily loss stop 10 percent
Product → Desk with the default values: paper books with live data, alerts only, or LIVE with your own keys (the Mode list).

A field-by-field guide of what you can change without code: Change it without code. Settings are grouped as defined in src/admin/manifest.ts. The desk sections are read by the running desk at start and applied again right after every save: no restart needed, except where noted. Sections and fields of an optional module appear only while that module is on in config.json.

SectionFieldsEffect on the desk
DeskMode (Paper trading, Alerts only, LIVE), paper bankroll (SOL, default 10), max open memecoin positions (5), daily loss stop (10 %)Live; a Mode change to or from LIVE waits for a restart
Memecoin lanesOn/off and ticket size (% of paper equity) for moonshot (1 %), graduation (1.5 %), revival (1 %) and smart money (1 %). Ticket range 0.1–5 %.Live (Memecoin lanes)
Smart walletsRounds before a wallet can be smart (8), minimum mean hold in seconds (60), live candidate feed URLs, smart wallets needed for a consensus (3)Live (Smart wallets). Feed URLs must start with https://.
Liquidation mapBackground refresh on/off, coins, accounts read per refresh (2,000), refresh every N minutes (30), alert distance (1.5 %), minimum cluster size for alerts (USD 5,000,000)Live (Liquidation map)
ResearchBackground research refresh on/off, wallet book every N minutes (60), backtests and lane replay every N hours (24)Live (Research refresh)
Trend & leverage (perps module)Leverage profile: safe, growth (default), aggressiveLive (Leverage)
Live tradingConfirmation sentence, dry run, pump.fun on/off, max per buy and fee reserve; with the perps module also Hyperliquid on/off, testnet, per-order and exposure capsApplies after a restart; see Live trading.
IntegrationsAnthropic API key, Telegram bot token, Solana RPC URL, and for live trading the Solana wallet key; the TypeSafe Jev API key with the jev module; the Hyperliquid API wallet key and account address with the perps module — all are secrets (encrypted, owner-only)Applied at start and on save. The RPC URL sets solanaRpc and the pump.fun WebSocket (details).
BrandProduct name, accent colour, logoThe name, accent and logo (PNG, JPEG or WebP) replace OUTRIDER's in the dashboard header, page title and footer, and the name heads the Telegram replies and the start message.
NotificationsWebhook URL, webhook signing secretThe console can POST signed alerts to your HTTPS webhook when a blocker health check fails (turn it on in the kit settings). Desk trade alerts go to Telegram.
config.json is the base

A Desk, Memecoin lanes, Smart wallets, Liquidation map or Trend field overrides config.json only once you change it from its console default. Desk → Mode and the Live trading section are the exception: while the console runs they always decide, defaults included. The full mapping is in Configuration.

05Keys and secrets

  • Secret fields are write-only: they can be replaced or cleared (owner) and tested (manager or owner; the Telegram token test calls Telegram's getMe), never read back.
  • If the matching environment variable is set (ANTHROPIC_API_KEY, TELEGRAM_BOT_TOKEN, TYPESAFE_API_KEY, SOLANA_PRIVATE_KEY, HL_API_WALLET_KEY, HL_ACCOUNT_ADDRESS), it wins and the field is locked in the console. The TypeSafe and Hyperliquid fields are part of an optional module and are only shown, and locked, while that module is on.
  • Stored secrets are encrypted with the console's secret key: ADMIN_SECRET_KEY from the environment, or a key generated once into data/.admin-secret-key (file mode 600). The algorithm is AES-256-GCM. Without that key, stored secrets cannot be read: keep a copy separate from your data/ backup (Secrets and backups).
Integrations page: Anthropic API key, Telegram bot token, Solana RPC URL and the LIVE Solana wallet private key, each shown as Not set with a Set button
System → Integrations with the optional modules off. Secrets are write-only: each field says only Set or Not set. The TypeSafe Jev field appears with the jev module, the Hyperliquid fields with the perps module.
Integrations page: Anthropic API key, Telegram bot token, Solana RPC URL and the LIVE Solana wallet private key, all Not set
Integrations with the LIVE Solana key field. With the perps module on, two Hyperliquid fields appear here too.

06Health, metrics and the live desk

CheckSeverityPasses when
Solana RPC answersblockergetHealth returns ok on your solanaRpc
Hyperliquid API answersblockerThe info API returns prices
pump.fun stream is livewarningAn event in the last 5 minutes
Trade journal hash chain intactblockerThe journal verifies (verify)
Liquidation map refreshed in the last 2 hinfodata/liqmap.json is younger than 2 hours
Telegram bot token is validwarningTelegram accepts the token

Metrics: paper equity (SOL), closed paper trades, win rate, wallets tracked, smart wallets, and positions on the liquidation map. These are paper figures, not earnings. The Live desk page shows the dashboard inside the console.

Status page: the Solana RPC, Hyperliquid API and trade journal checks as blockers, all passing; the pump.fun stream and the optional Telegram bot as warnings, passing; the liquidation-map freshness check as info, failing
Monitor → Status: the info check "Liquidation map refreshed in the last 2 h" fails and says why while the map is older than two hours; the desk refreshes the map itself. Blockers stop a launch; warnings are worth a look; info is for your attention only.
Console Overview: blockers and health strip, paper equity in SOL, closed paper trades, win rate, wallets tracked, smart wallets, positions on the liquidation map, a Needs you list and the configuration health score
Overview of a local install opened on the labelled sample paper book (src/web/demo-data.mjs) and a liquidation map built on 9 Nov 2026. Every figure is a paper or data count, not money. There is no revenue panel: the desk has no money module. Two-factor is not switched on in this picture, so Needs you lists it.

07Audit log, history and export

  • Audit log. Every sign-in, sign-out, password change, settings change (secrets shown only as set/cleared), secret test, team change and alert is written with who, when and what. Every member can read and filter it; an owner can download it as CSV.
  • History. Every save is a version. An owner can compare two versions and roll back; secrets and environment-locked values are not rolled back.
  • Export and import. Owners can export the settings to a file and import them on another install (with a preview first).

08Running without the console

DESK_ADMIN=0 npm start starts the desk and dashboard without the console. Then config.json is the only source of settings, and the dashboard has no sign-in: protect it with DASH_TOKEN and keep it on 127.0.0.1. DASH=0 turns off both dashboard and console.