◆ V5.0 FEATURES

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
🟢 ARMEDFilter pass + price-action trigger fired + all pillars clearEnter now (or queue the order)
🔵 HOLDOwned, score ≥ 75, no pillar breachNothing — position is healthy
🟡 WATCHQualified by filter, no trigger yetWait — the moment hasn't arrived
🟠 TIGHTENOwned but degrading — score 60-74 or pillar cautionRaise stop or reduce size
🔴 EXITOwned + hard pillar breach OR score < 60Rotate to cash
⚫ COLDFilter fail — don't openSkip

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_dayToday's range is fully inside yesterday's — coil
n_day_breakoutClose above prior 20-day high
volume_expansionToday's volume ≥ 1.5× the 20-day average
pullback_bounceTagged 20-EMA within 3 bars and bouncing on volume
vwap_reclaimIntraday: lost session VWAP, then reclaimed
bearish_divergencePrice HH + RSI LH — exhaustion
bullish_divergencePrice LL + RSI HL — reversal precursor
liquidity_sweep_reclaimPunched a swing high/low on ≥1.4× vol, snapped back
bull_flagSharp pole + tight flag + volume break
engulfing_reversalToday's body engulfs yesterday's with ≥1.3× volume
gap_and_goOpen > yday high, close in upper third, ≥1.2× volume
key_level_reclaimBroke 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:

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:

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:

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:

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_ENABLEDtrueMaster switch for the price-action engine
TRIGGER_LOOP_SEC60Base cadence during market hours
TRIGGER_OPENING_SEC309:30-10:30 ET cadence
DAILY_BRIEFING_ENABLEDtrue6:25 AM MST weekday email
TRACK_RECORD_PUBLISHfalseOwner-only; keep false for users
AI_THESIS_ENABLEDtrueMaster switch for thesis panel
AI_THESIS_PROVIDERopenaiopenai / anthropic
AI_THESIS_API_KEY(required)BYOK. Empty = thesis panel shows config error
AI_THESIS_MODELgpt-4o-miniAny model your provider serves
AI_THESIS_BASE_URL(empty)Override for Ollama/self-hosted

See also: v5.0 API endpoints · Troubleshooting

◆ READ NEXT

The framework: indicators filter, price action triggers →

v5.0 release notes — full changelog →

Broker setup — E*TRADE OAuth + Tradier →