Local-first Solana paper-trading lab with explainable decisions and learning.
5.1K
A local-first Solana paper-trading lab where every decision leaves evidence.
Signal Arcade watches official Pump and PumpSwap program events, ranks opportunities, simulates fee-aware paper trades, and learns from measured outcomes. Follow the deterministic Baseline, inspect Challenger skills, and optionally run a private local AI Coach.
No wallet keys, live orders, paid provider or cloud AI are required.
GitHub · Releases · Full documentation · MIT License
Trading rules, model recipes, proof gates, coverage settings and provider budgets are unchanged. Schema 16 and existing learning, positions, seasons and Champion history are retained.
Full changelog · Validation and runtime limits
| Component | What it does |
|---|---|
| Fast Baseline | Makes explainable paper decisions using fresh market evidence and hard safety limits. |
| Statistical Challenger | Learns Entry, Manipulation, Sizing and Exit skills from chronological, fee-inclusive outcomes. Qualified skills can provide bounded, monitored support when permitted. |
| Local AI Coach | Studies bounded ideas during quiet periods. A supported idea still needs permission, a fresh Challenger tournament and activation proof before influencing decisions. |
| Arena and seasons | Track virtual bankroll, positions, drawdown, fees and recorded strategy use across comparable paper seasons. |
| Replay and diagnostics | Inspect saved decisions, paper receipts, equity history, provider activity, learning proof and performance gaps. |
Docker with Compose support and one admin password are required. Provider keys and local AI models are optional.
.envSIGNAL_ARCADE_ADMIN_PASSWORD=replace-this-with-a-long-unique-password
docker-compose.ymlThis is the complete Compose example from the GitHub README, including the private optional Ollama companion, persistent volumes and container security settings.
services:
signal-arcade:
image: nicxx2/signal-arcade:1.10.12
pull_policy: always
restart: unless-stopped
stop_grace_period: 45s
init: true
environment:
SIGNAL_ARCADE_ADMIN_PASSWORD: ${SIGNAL_ARCADE_ADMIN_PASSWORD:?Set a long admin password in .env}
SIGNAL_ARCADE_OLLAMA_URL: http://ollama:11434
SIGNAL_ARCADE_OLLAMA_ACCELERATOR: cpu
extra_hosts:
- "host.docker.internal:host-gateway"
ports:
- "8765:8765"
volumes:
- signal-arcade-data:/data
read_only: true
tmpfs:
- /tmp:size=256m,noexec,nosuid
security_opt:
- no-new-privileges:true
cap_drop:
- ALL
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
ollama:
image: ollama/ollama:0.33.1
pull_policy: always
restart: unless-stopped
init: true
environment:
OLLAMA_HOST: 0.0.0.0:11434
OLLAMA_NO_CLOUD: "1"
OLLAMA_CONTEXT_LENGTH: "2048"
OLLAMA_KEEP_ALIVE: 10m
OLLAMA_MAX_LOADED_MODELS: "1"
OLLAMA_NUM_PARALLEL: "1"
OLLAMA_MAX_QUEUE: "4"
LLAMA_ARG_CACHE_RAM: "512"
CUDA_VISIBLE_DEVICES: "-1"
ROCR_VISIBLE_DEVICES: "-1"
expose:
- "11434"
volumes:
- signal-arcade-models:/root/.ollama
security_opt:
- no-new-privileges:true
cap_drop:
- ALL
healthcheck:
test: ["CMD", "ollama", "list"]
interval: 30s
timeout: 10s
start_period: 20s
retries: 5
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
volumes:
signal-arcade-data:
signal-arcade-models:
docker compose up -d
Open http://localhost:8765, or http://server-ip:8765 from another device on your LAN. Use any username and the password from .env.
Portainer users can paste the same Compose file into the Web editor and define SIGNAL_ARCADE_ADMIN_PASSWORD as a stack environment variable.
docker compose pull
docker compose up -d
Keep the same named data and model volumes. The prior paper-engine state resumes after startup health checks. Signal Arcade does not mount the Docker socket or control your host.
v1.10.12 retains schema 16: upgrading from published v1.10.7–v1.10.11 adds no evidence migration or reset. Database schema alone does not guarantee rollback compatibility: older images may not understand saved coverage-policy records or activation contracts. Follow the full upgrade and rollback guidance. Never copy only a running SQLite database file while leaving its WAL behind.
After a restart, new observations need five minutes of uninterrupted provider history and then their own five-minute outcomes before advancing retraining. Retained evidence may progress sooner; waiting for fresh evidence is not automatically a stuck learner.
Linear is the simple default; a CPU XGBoost Entry contender may compete when it justifies its complexity on untouched validation. Training and validation stay chronological, with outcome embargoes and separate proof evidence.
Each skill must pass its own qualification and forward comparison. Allow when qualified saves permission; it does not bypass proof or guarantee activation. Active support stays bounded by Baseline safety, and degraded or unverifiable skills can be suspended with their dependent downstream skills.
Settings offers native-skill outcome-coverage choices of 70% (default), 65%, 60% or 55%. This measures usable outcome coverage, not win rate. A lower setting accepts less complete evidence; it does not improve a model or waive the other checks. The separate Coach study retains its 70% requirement.
Training, Challenger testing and active Champion support are distinct stages. More training, a promotion or a short profitable period does not establish better future trading.
Read the learning specification
The Compose example keeps Ollama private to the Docker network. CPU inference is the default; no model is downloaded automatically. The default model is qwen3.5:2b, and the app remains functional without Ollama.
Direct Qualified Coach control and Live Critic are future stages. Persisted legacy Guarded critic mode is separately labelled; the current interface does not enable it.
GPU inference is optional and requires Docker hardware access, not just an environment setting. See the NVIDIA overlay, AMD ROCm overlay and full AI setup.
Public Solana RPC and DEX Screener work without accounts. Settings → Data providers supports guided Helius, Alchemy and SolanaTracker presets, custom endpoints and explicit provider budgets. Public endpoints can throttle, disconnect or miss events; a paid provider cannot guarantee uninterrupted coverage.
Provider keys are stored server-side and never returned to the browser. Submit secrets through localhost or HTTPS; a plain LAN connection supports non-secret controls. Keep the dashboard on a trusted network or use an appropriately secured HTTPS reverse proxy.
V1 has no wallet-key input, seed phrase handling, transaction signing or broadcasting path. Stale or unknown execution evidence fails closed. Docker logs and high-volume histories are bounded, while durable trading and proof records can still grow.
Provider matrix · Security policy
Diagnostics guide · Current validation record
All 18 screenshots referenced by the full README are included below. They show real paper-app data captured on 7 September 2026 from v1.10.7; they are historical UI examples, not current-version screenshots or performance claims. See the capture record.


















Star the GitHub repository if you find Signal Arcade useful. Issues and contributions are welcome; please read the contribution guide.
Released under the MIT License. Paper-trading education only; no promise of profit.
Content type
Image
Digest
sha256:a3b2208f3…
Size
139.8 MB
Last updated
14 days ago
docker pull nicxx2/signal-arcadePulls:
333
Last week