Everything new in Swing Deck v5.0
v5.0 is the biggest release since launch. This page is the reference for every new feature: what it does, how to use it, how to configure it, and how to troubleshoot it. For the philosophy behind v5.0, read Indicators don't trigger trades. Price action does.
Status Light — one signal per position
v4.x showed an 11-cell radar chart per ticker — technically correct, mentally exhausting. v5.0 keeps that grid (click any card to expand), but shows one color per ticker above it. Glance 30 positions in 2 seconds.
| STATE | MEANING | ACTION |
|---|---|---|
| 🟢 ARMED | Filter pass + price-action trigger fired + all pillars clear | Enter now (or queue the order) |
| 🔵 HOLD | Owned, score ≥ 75, no pillar breach | Nothing — position is healthy |
| 🟡 WATCH | Qualified by filter, no trigger yet | Wait — the moment hasn't arrived |
| 🟠 TIGHTEN | Owned but degrading — score 60-74 or pillar caution | Raise stop or reduce size |
| 🔴 EXIT | Owned + hard pillar breach OR score < 60 | Rotate to cash |
| ⚫ COLD | Filter fail — don't open | Skip |
Hover the status badge to see the 4-layer tooltip: macro regime, sentiment (VIX), indicator score, price-action triggers. Each layer's stance explained in one line.
Price-Action Triggers — 11 primitives
Every 60 seconds during market hours (30s during the 9:30-10:30 ET opening window), the engine runs every ticker in your portfolio through 11 price-action primitives. Each fire is logged, scored 0-100, and surfaced through the status-light system.
The 11 primitives:
| PRIMITIVE | FIRES WHEN |
|---|---|
| inside_day | Today's range is fully inside yesterday's — coil |
| n_day_breakout | Close above prior 20-day high |
| volume_expansion | Today's volume ≥ 1.5× the 20-day average |
| pullback_bounce | Tagged 20-EMA within 3 bars and bouncing on volume |
| vwap_reclaim | Intraday: lost session VWAP, then reclaimed |
| bearish_divergence | Price HH + RSI LH — exhaustion |
| bullish_divergence | Price LL + RSI HL — reversal precursor |
| liquidity_sweep_reclaim | Punched a swing high/low on ≥1.4× vol, snapped back |
| bull_flag | Sharp pole + tight flag + volume break |
| engulfing_reversal | Today's body engulfs yesterday's with ≥1.3× volume |
| gap_and_go | Open > yday high, close in upper third, ≥1.2× volume |
| key_level_reclaim | Broke support, stayed below ≥2 bars, reclaimed on volume |
Every fire also has a strength score 0-100 and a one-line narrative. The minimum strength to promote WATCH → ARMED is 20 (auto-tuned per-primitive after 10+ samples; see Per-User Calibration).
Expand any ticker card to see which primitives fired today with their narratives. Every fire is also logged to trigger_fires.log in your swing-audit directory for audit.
Focus Mode
The FOCUS chip in the action strip collapses the dashboard to only positions that need action: ARMED, TIGHTEN, EXIT. Most of the time, that list is empty.
Use this as your default screen during market hours. Discipline is doing nothing when nothing needs doing.
Click again to restore the full view. State is persisted to localStorage.
AI Thesis (BYOK)
Every ticker card now has a collapsible ✨ AI THESIS panel. Expand it and the engine generates a one-paragraph thesis grounded in your live Swing Deck data: filter score, which triggers fired today, active pillar violations, macro regime, historical primitive hit rate, and consensus from other Premium users.
BYOK — bring your own LLM key. No data leaves your machine except to the provider you choose with your own key. Supports:
- OpenAI —
gpt-4o-miniis the default (cheap, fast, high-quality) - Anthropic — Claude 3.5 Haiku or Sonnet
- Local (Ollama / LM Studio) — fully private, free, point
AI_THESIS_BASE_URLatlocalhost:11434/v1
Configuration
Add to your .env:
AI_THESIS_ENABLED=true AI_THESIS_PROVIDER=openai AI_THESIS_API_KEY=sk-... AI_THESIS_MODEL=gpt-4o-mini
For Anthropic:
AI_THESIS_PROVIDER=anthropic AI_THESIS_API_KEY=sk-ant-... AI_THESIS_MODEL=claude-3-5-haiku-latest
For Ollama (free, local):
AI_THESIS_PROVIDER=openai AI_THESIS_API_KEY=ollama AI_THESIS_BASE_URL=http://localhost:11434/v1 AI_THESIS_MODEL=llama3.2
Feedback buttons
Every generated thesis has a row of buttons: 👍 👎 shorter longer +macro +price ↻. Each click tunes the prompt for you — length, focus weights, tone. After 50 interactions your thesis reads differently from anyone else's. The preferences are stored in ai_thesis_prefs.json (gitignored, local only).
Reset any time at POST /thesis/ai/reset. Check current state at GET /thesis/ai/status.
Daily Briefing Email
Every weekday at 6:25 AM MST (1 hour before US market open), the local dashboard computes your portfolio state and POSTs it to api.swing-deck.com, which formats and sends an email via Resend.
The email shows:
- Portfolio score + grade
- Macro regime (standard / defensive) + current VIX + oil
- State counts (ARMED / HOLD / WATCH / TIGHTEN / EXIT / COLD)
- Every ARMED ticker with the fired primitive
- Every TIGHTEN ticker with the reason
- Every EXIT ticker with the pillar breach
If nothing needs action: "◆ ALL POSITIONS HEALTHY · NOTHING REQUIRES ACTION". Discipline is doing nothing when nothing needs doing.
Configuration
Requires a valid license with alerts_email entitlement. Controlled by:
DAILY_BRIEFING_ENABLED=true
Test it manually without waiting for 6:25 AM:
curl http://localhost:8001/briefing/preview # see the JSON payload curl http://localhost:8001/briefing/send-now # fire it now
Per-User Calibration Warmup
Over your first 30 days, the engine learns which price-action primitives work for you. Every fire is logged with entry price. At +5 bars (≈1 trading week), each fire is graded: win if price is up ≥ 2%, loss if down ≥ 2%.
Once a primitive has ≥10 graded outcomes, the auto-tuner adjusts its strength gate:
- Hit rate ≥ 60% → lower the gate (let more fires through; they work)
- Hit rate ≤ 40% → raise the gate (demand higher conviction)
- Otherwise → leave unchanged
Bounded [10..50] so the engine never fully silences or floods you. Check progress at:
curl http://localhost:8001/calibration/status | python3 -m json.tool
Why this is a moat: by day 31, your engine is tuned to your portfolio, your regime exposure, and your broker's fill quality. Switching to a competitor means starting over — pure switching cost.
Public Track Record
The owner's local dashboard publishes a daily snapshot of notable fires to swing-deck.com/track-record. Every ARMED / EXIT / TIGHTEN fire is publicly auditable with date, ticker, primitive, strength, and narrative.
This is a trust moat. Anyone can verify what the system said at the time — no retroactive editing. The publish is owner-only; regular users don't publish.
To opt in as the owner:
# In your local .env TRACK_RECORD_PUBLISH=true # On Railway (for your swingdeck-api) TRACK_RECORD_OWNER_KEY=SWING-XXXX-XXXX-XXXX
Consensus Network
Every 60 seconds, your local dashboard submits anonymized trigger fires to /api/consensus/submit. The payload contains ticker + primitive + strength + state — nothing else. No portfolio size, no P&L, no IP.
User identity is hashed via SHA-256 of the license key. Aggregate reads are gated by a k-anonymity floor of 5 users — we never return data that could identify an individual.
Query the crowd:
GET /api/consensus/ticker/NVDA GET /api/consensus/top
Example response — "73% of Premium users are ARMED on NVDA right now, top primitive n_day_breakout." Available in the AI thesis context automatically once there are ≥5 users firing on that ticker.
Mobile PWA
Every page on swing-deck.com is now a Progressive Web App. On iOS Safari or Android Chrome, tap Share → Add to Home Screen. The site installs as a standalone app with:
- Full-screen launch (no browser chrome)
- Offline cache of the marketing site + blog after first visit
- Dark theme-color that extends into the OS status bar
- Home-screen icon
Works best for checking the track record + blog on mobile. The dashboard itself (localhost:8001) is still desktop-only.
v5 Environment Variables Reference
Full list of new env vars in v5.0. All optional — defaults work out of the box.
| VAR | DEFAULT | NOTES |
|---|---|---|
| TRIGGER_LAYER_ENABLED | true | Master switch for the price-action engine |
| TRIGGER_LOOP_SEC | 60 | Base cadence during market hours |
| TRIGGER_OPENING_SEC | 30 | 9:30-10:30 ET cadence |
| DAILY_BRIEFING_ENABLED | true | 6:25 AM MST weekday email |
| TRACK_RECORD_PUBLISH | false | Owner-only; keep false for users |
| AI_THESIS_ENABLED | true | Master switch for thesis panel |
| AI_THESIS_PROVIDER | openai | openai / anthropic |
| AI_THESIS_API_KEY | (required) | BYOK. Empty = thesis panel shows config error |
| AI_THESIS_MODEL | gpt-4o-mini | Any model your provider serves |
| AI_THESIS_BASE_URL | (empty) | Override for Ollama/self-hosted |
See also: v5.0 API endpoints · Troubleshooting