Local-first Solana paper-trading lab with explainable decisions and learning.
1.5K
A local-first Solana paper-trading lab where every decision leaves evidence.
Signal Arcade watches official Pump and PumpSwap events, ranks opportunities with a deterministic Baseline, simulates fee-aware paper fills, and learns from recorded outcomes.
An optional local AI Coach researches ideas outside the trading decision path. No wallet keys, live orders, paid provider or cloud AI are required.
GitHub repository · Releases · Full documentation
Paper trading only. Results and model improvements do not guarantee future profit.
The 70% coverage requirement, fees, chronological training, independent proof, Baseline boundaries and hard-exit protections remain in place.
The interface supports desktop and mobile browsers.
Interface screenshots captured from v1.10.7 on 7 September 2026. They show real paper-app data at capture time; the current release is v1.10.10.
Follow paper equity, open positions, season progress and recent decisions.

Compare retained seasons, including returns, drawdown, fees and recorded strategy use.

Explore skill qualification, learning progress and Challenger evidence.

Inspect saved equity history and the evidence behind paper decisions.

Explore the full gallery: AI Coach, Champion battles, provider settings, diagnostics and mobile views are included in the GitHub README.
Docker with Compose support and an 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 configuration uses the published v1.10.10 image and CPU inference for the optional Ollama service.
services:
signal-arcade:
image: nicxx2/signal-arcade:1.10.10
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 your .env file.
No AI model is downloaded automatically. The app's Baseline and Challenger learning remain functional without a local AI model.
Portainer: paste the same Compose file into the Web editor and define SIGNAL_ARCADE_ADMIN_PASSWORD as a stack environment variable.
Baseline approves opportunities within deterministic safety and execution limits. Separate Challenger skills must earn their own authority:
| Skill | Role |
|---|---|
| Entry | Learn which Baseline-approved opportunities to keep or veto. Linear and XGBoost compete under matching validation rules. |
| Manipulation | Learn recurring adversarial flow patterns and veto eligible opportunities when supported by evidence. |
| Sizing | Select bounded 0.5×–2× sizes while preserving cash, exposure and executable-route limits. |
| Exit | Learn bounded review timing while preserving stop losses, structural exits and absolute hold limits. |
Outcomes are collected at 1, 5, 10, 15 and 20 minutes. Missing executable exits remain unknown; they do not become invented zero-profit outcomes.
Training and validation follow chronology. Independent forward evidence tests frozen candidates against the current Champion. A crown and permission alone do not establish current activation readiness.
Enable Allow when qualified in Learning → Challenger to permit proved skills to join automatically when their current activation checks pass. Entry does not need to qualify first for another skill to earn support.
Active skills remain monitored. Suspension removes their trading influence while new candidates and shadow comparisons can continue when learning is running. Changes in skill combinations require the appropriate fresh proof.
Learning history persists across seasons and remains separated by its relevant configuration and evidence contracts.
Read the learning specification
The Learning Overview shows what current support changes on matching opportunities:
The view uses bounded, fee-inclusive checkpoint evidence for the current season and exact active Champion versions. Missing pairs remain in coverage, pending outcomes stay separate, and uncertainty is displayed.
At least 30 usable pairs and 70% coverage are required before an observed-advantage label is possible; the paired uncertainty range must also support it.
This is a modeled checkpoint comparison, not a second portfolio or realized account profit. Individual skill differences must not be added together. Use Results for actual paper-account performance.
Local AI is optional. The included Ollama service is available inside the Compose network and is not published to the host or LAN.
Coach work yields to critical engine work and cannot bypass Baseline boundaries or Champion qualification.
CPU inference is the default. See the full README for optional NVIDIA and AMD configurations.
V1 watches official Pump/PumpSwap program events. It simulates native-SOL Pump curves and wrapped-SOL PumpSwap markets; it is not a general scanner for every Solana venue. USDC is an optional accounting currency, not support for USDC-quoted pools.
The default setup uses keyless public Solana RPC and DEX Screener context. Optional provider presets and custom endpoints are available under Settings → Data providers.
Provider limits and backoff remain enforced. Public endpoints may throttle, disconnect or miss events. Provider dashboards remain authoritative for billed usage and credits.
Provider secrets can be submitted through localhost or HTTPS. Plain LAN HTTP supports non-secret controls; use localhost or an HTTPS reverse proxy to configure keys.
The additional learning reserve-refresh worker is disabled by default. To opt in, add this entry to the app service's existing environment block:
SIGNAL_ARCADE_LEARNING_RESERVE_REFRESH_ENABLED: "true"
Use a staged Shadow rollout and review provider capacity and diagnostics. This is separate from the held-position watchdog and does not weaken route validation or guarantee 70% coverage.
Settings → Diagnostics exposes worker health, queue pressure, processing lag, collection progress, provider state and learning summaries.
Historical diagnostics use a separate 512 MiB allowance, targeting:
The byte cap takes priority. Recording yields under contention and labels gaps. Export failures are reported explicitly; check that an NDJSON download ends with an export_complete trailer before treating it as complete history.
Diagnostics are separate from training evidence. Raw event retention, logs and optional work are bounded, but durable trading and proof records can still grow. Monitor host disk space during extended operation.
Busy periods can still cause lag or candidate expiry. A recovered queue or a loss-free interval does not establish sustained peak-load capacity.
Back up persistent data before upgrading. Use a consistent SQLite backup or a snapshot of the complete stopped data volume.
docker compose pull
docker compose up -d
Keep the same Compose project and named volumes to retain your data and models. The app does not need access to the Docker socket.
v1.10.10 retains database schema 16. Upgrades from published v1.10.7–v1.10.9 preserve bankroll, positions, seasons, settings, learning evidence and Champion history without a new season or learning reset.
Older native Entry artifacts need a fresh fit under the corrected validation contract before providing support. Unfinished legacy Coach studies close as inconclusive with their evidence retained; new studies gather fresh Policy evidence. Existing support and contribution preferences are preserved, subject to current safety checks.
Read the upgrade and rollback guidance before changing to an older release. Shared schema versions do not make all learning and activation contracts interchangeable.
V1 has no wallet-key input, seed phrase handling, transaction signing or transaction broadcasting path.
Paper execution models fees, latency and route availability, but real markets can behave worse. Model qualification, positive comparisons and Champion promotions do not guarantee profitable live trading.
Unsupported routes, stale evidence and unreviewed account extensions remain excluded.
Report an issue · Contributing · Security policy · MIT License
If Signal Arcade is useful to you, consider starring the GitHub repository.
Content type
Image
Digest
sha256:904be3bc1…
Size
142.3 MB
Last updated
6 days ago
docker pull nicxx2/signal-arcadePulls:
317
Last week