dexter.mp4
Dexter 3.0 is a TUI Solana app for Pump.fun and PumpSwap. Here you can create Pump.fun tokens, but... Main function is to gather Pump.fun creators and see how their tokens perform by running calculations with an algorithm, then composing a leaderboard out of creators. It monitors Pump.fun for new tokens, buys if creator of the token is in leaderboard. The main surface is the interactive dexter menu: it edits the whole .env, onboards missing settings, launches runtime flows, handles create and manage workflows, and exposes operator controls without leaving the terminal. The CLI mirrors the same surface for automation and precise manual runs.
Windows note: Dexter's TUI uses curses. pip install . now installs windows-curses automatically on Windows, and if the TUI dependency is unavailable Dexter falls back to CLI help instead of crashing during import.
Run:
dexterIn an interactive terminal this opens Dexter's curses UI. It:
- writes directly to
.env - reloads config immediately after saves
- guides missing setup through onboarding
- asks for extra confirmation before
DEXTER_MAINNET_DRY_RUN=falseorDEXTER_ALLOW_MAINNET_LIVE=true
Main menus:
Run: launch trader, collector, or analyzerCreate: seed an existing mint or plan/build a Pump.fun create
Manage: inspect or liquidate tracked positions
Configure: edit the full.env
Help: review modes, controls, and key runtime concepts
The configuration pages are:
Quick Setup: network, mode, wallet, database, mainnet RPCRuntime & Safety: wsLogs supervision, datastore, shutdown behavior, mainnet gatesRisk & Strategy: strategy profile, spend caps, reserve floor, retry behaviorAlerts & Paths: Telegram, Discord, desktop notifications, logs, state, exports, backups
If you run dexter in a non-interactive shell, Dexter prints CLI help instead of launching the TUI. dexter menu and dexter interactive also open the TUI. If the TUI dependency is missing, Dexter prints an install hint and the CLI remains available through commands like dexter help and dexter doctor.
Dexter expects PostgreSQL-backed operation. Treat the database as required infrastructure.
python3 -m venv env
source env/bin/activate
pip install -r req.txt
pip install -e .
./install_postgre.sh
cp .env.example .envWindows PowerShell:
py -m venv .venv
.venv\Scripts\Activate.ps1
python -m pip install -r req.txt
python -m pip install -e .
dexter database-setup
Copy-Item .env.example .envWindows PostgreSQL one-command setup:
dexter database-setupOn Windows, dexter database-setup is the public-ready path: it installs PostgreSQL binaries when needed, creates or reuses a Dexter-owned local cluster under .dexter/postgres/..., stores Dexter's real local admin and app credentials in managed metadata, rewrites .env, and creates the Dexter role, database, tables, and schema for you. The managed cluster listens on 127.0.0.1:55432 by default so it does not collide with a separate system PostgreSQL on 5432.
If you prefer a script from the repo root instead of the CLI command:
powershell -ExecutionPolicy Bypass -File .\install_postgres_windows.ps1Minimum setup before running Dexter seriously:
- database: on Windows,
dexter database-setupwritesDATABASE_URL,DB_*,POSTGRES_ADMIN_*, Dexter's managed local PostgreSQL paths, and the localpg_dump.exepath for you - bootstrap admin: if you skip
database-setup, setPOSTGRES_ADMIN_DSNorPOSTGRES_ADMIN_*when Dexter needs to create the DB, user, or schema - wallet: set
PRIVATE_KEYorDEXTER_TRADING_PRIVATE_KEYforsimulate,live, or on-chaincreate - mainnet RPC: set
HTTP_URLandWS_URL - safety gates: leave
DEXTER_MAINNET_DRY_RUN=trueandDEXTER_ALLOW_MAINNET_LIVE=falseuntil you intentionally want live mainnet sends
Bootstrap the database when needed:
dexter database-setupIf PostgreSQL is already installed and running, or if you're on Linux/macOS and only need Dexter's schema:
dexter database-initOn Windows, dexter database-init also repairs a Dexter-managed .env by reloading the real local admin and app passwords from Dexter's managed metadata before it refreshes roles and tables.
Useful first checks:
dexter help
dexter doctor --network mainnet --mode read_only
dexter run --network mainnet --mode paper --doctor-firstread_only: observe onlypaper: run the full strategy loop with simulated positions and local PnLsimulate: sign and simulate transactionslive: submit live transactions where the selected network and gates allow it
Mainnet rules:
DEXTER_MAINNET_DRY_RUN=truekeeps mainnetlivein simulation behavior- real mainnet sends require both
DEXTER_MAINNET_DRY_RUN=falseandDEXTER_ALLOW_MAINNET_LIVE=true USE_MEVonly applies to live mainnet buy and sell submissions- mainnet
createsends are blocked in Dexter's current create flow; use--dry-runor--simulate-tx
# Open Dexter's main feature
dexter
# Mainnet paper runtime with preflight checks
dexter run --network mainnet --mode paper --doctor-first
# Mainnet create planning
dexter create \
--network mainnet \
--mode live \
--dry-run \
--name DexterTest \
--symbol DXT \
--uri https://example.invalid/token.json \
--buy-sol 0.01
# Watch the operator dashboard against mainnet-configured state
dexter dashboard --network mainnet --watchShow global help or the help for one command.
Args:
<command>: optional command name, for exampledexter help create
Guided launcher for the runtime.
Args:
--mode {read_only,paper,simulate,live}: overrideDEXTER_RUNTIME_MODE--network {devnet,mainnet}: overrideDEXTER_NETWORK--target {trade,collector,analyze}: choose what Dexter launches--doctor-first: rundoctorbefore launch
Start the collector directly.
Args:
--mode {read_only,paper,simulate,live}--network {devnet,mainnet}
Start the trader directly.
Args:
--mode {read_only,paper,simulate,live}--network {devnet,mainnet}
Start the analyzer directly.
Args:
--mode {read_only,paper,simulate,live}--network {devnet,mainnet}
Validate the current setup.
Args:
--mode {read_only,paper,simulate,live}: load config as that mode--network {devnet,mainnet}: load config as that network--component {all,collector,trader}: choose the validation profile
Checks:
- env and safety gates
- database connectivity
- HTTP RPC reachability
- WebSocket RPC reachability
- wallet decoding
- writable directories
- backup tooling discovery
Seed an existing mint into Dexter or plan/build/send an on-chain Pump.fun create flow.
Common args:
--mode {read_only,paper,simulate,live}--network {devnet,mainnet}--dry-run: preview or build only without the normal follow-through
Seeded handoff args:
--mint: mint Dexter should take over--owner: creator or owner address for the session--bonding-curve: Pump.fun bonding curve when the token is still on Pump.fun--market {pump_fun,pump_swap}: starting market source--trust-level: initial trust level--buy-price: seed current or entry price--token-balance: seed held token balance--cost-basis-lamports: seed explicit cost basis--profit-target-pct: seed target percentage--load-database: opt back into standard DB bootstrap instead of DB-free handoff
On-chain create args:
--name: token name--symbol: token symbol--uri: metadata URI--image: local image to upload to Pump.fun IPFS--description: description used with--image--twitter: twitter URL used with--image--telegram: telegram URL used with--image--website: website URL used with--image--hide-name: requestshowName=falseduring metadata upload--ipfs-upload-url: override the Pump.fun IPFS upload endpoint--buy-sol: bundled auto-buy size in SOL--slippage-pct: bundled auto-buy slippage percent--priority-micro-lamports: explicit compute-unit price--simulate-tx: force signed simulation instead of send--no-follow: do not launch Dexter after a live create send
Rules:
- seeded mode requires
--mintand--owner - on-chain mode requires
--name,--symbol,--urior--image, and--buy-sol > 0 - mainnet create sends are blocked; use
--dry-runor--simulate-tx
Inspect or liquidate positions from Dexter's local recovery store.
Args:
--mode {read_only,paper,simulate,live}--network {devnet,mainnet}--sell-mint <mint>: sell one tracked mint--sell-all: sell every open tracked position for the selected network--reason <text>: reason attached to manual exits--json: emit the recovery-store view as JSON
Note:
manageworks from Dexter's local tracked-position store, not from a fresh wallet or chain inventory scan
Render the operator dashboard.
Args:
--mode {read_only,paper,simulate,live}--network {devnet,mainnet}--watch: refresh continuously--interval <seconds>: refresh interval for--watch--limit <rows>: rows per dashboard section--json: emit JSON instead of text
Manual operator controls.
Args:
action: one ofpause,resume,force-sell,blacklist,whitelist,watchlist-add,watchlist-remove--mode {read_only,paper,simulate,live}--network {devnet,mainnet}--owner <creator>: required forblacklistandwhitelist--mint <mint>: required forforce-sell,watchlist-add, andwatchlist-remove--reason <text>: optional reason forforce-sell
Replay normalized session data.
Args:
--mode {read_only,paper,simulate,live}--network {devnet,mainnet}--session-id <id>: replay one session--mint-id <mint>: replay the latest session for a mint--json: emit JSON
Export normalized research data.
Args:
--mode {read_only,paper,simulate,live}--network {devnet,mainnet}--kind {sessions,raw_events,leaderboard,positions,risk_events,strategy_profiles}: choose dataset--output <path>: output JSONL path--session-id <id>: filter session exports--mint-id <mint>: filter session or raw-event exports--leaderboard-version <version>: filter leaderboard exports--limit <n>: cap exported rows
Run a strategy backtest.
Args:
--mode {read_only,paper,simulate,live}--network {devnet,mainnet}--strategy {aggressive,balanced,conservative}: choose profile--input <file>: optional JSON or JSONL dataset--limit <n>: max records loaded when--inputis omitted--json: emit JSON
Run the migration harness.
Args:
--mode {read_only,paper,simulate,live}: config loading only--network {devnet,mainnet}: devnet-only in practice--json: emit JSON
Create or repair Dexter's PostgreSQL roles, database, tables, and schema after PostgreSQL itself exists. On Windows, this also repairs a Dexter-managed .env from Dexter's local PostgreSQL metadata when needed.
Args:
--network {devnet,mainnet}: config-resolution override; the work itself is local PostgreSQL bootstrap
Install or repair Dexter's managed local PostgreSQL on Windows, update .env, and run Dexter's schema bootstrap automatically.
Args:
--network {devnet,mainnet}: optional Dexter config override--major-version <n>: WinGet PostgreSQL major version to install when PostgreSQL is missing--admin-password <password>: Dexter localpostgressuperuser password; defaults to the managed value or a generated password--db-user <name>: Dexter application role name--db-password <password>: Dexter application role password--db-name <name>: Dexter application database name--db-port <port>: local PostgreSQL port; defaults to the managed value or55432--cluster-dir <path>: Dexter-managed PostgreSQL data directory--log-file <path>: Dexter-managed PostgreSQL log file--skip-install: skip WinGet and assume PostgreSQL is already installed locally--dry-run: print the install and setup actions without changing the machine
This is the fastest path to a usable Dexter session. It covers:
DEXTER_NETWORKDEXTER_RUNTIME_MODEPRIVATE_KEYDATABASE_URLHTTP_URLWS_URL
This page controls the runtime switches that matter most operationally:
DEXTER_ENABLE_WSLOGSDEXTER_DATASTORE_ENABLEDDEXTER_CLOSE_POSITIONS_ON_SHUTDOWNDEXTER_MAINNET_DRY_RUNDEXTER_ALLOW_MAINNET_LIVE
This page is where you shape how aggressive Dexter is:
DEXTER_STRATEGY_PROFILEDEXTER_PER_TRADE_SOL_CAPDEXTER_SESSION_SOL_CAPDEXTER_DAILY_SOL_CAPDEXTER_WALLET_RESERVE_FLOOR_SOLDEXTER_DAILY_DRAWDOWN_STOP_SOL- retry and execution knobs
- legacy trust-factor and profit-step settings
This page covers operational outputs and persistence:
- Telegram, Discord, and desktop notifications
- log, state, and export directories
- backup directory and backup tooling settings
PRIVATE_KEYis Dexter's default signer for create, buy, sell, and balance lookupDEXTER_TRADING_PRIVATE_KEYoverrides the trading signer when you want a separate execution keyDATABASE_URLis Dexter's preferred database setting inside the TUIdexter help <command>is still the fastest CLI lookup when you only need one command's flags
