Every signal, every debate, every trade is assembled from free public sources, reasoned over by locally-hosted LLMs, paper-traded on Alpaca, and published in full. The stack below is what makes that possible, and what we built ourselves because nobody had built it free.
Built across heterogeneous hardware so every role gets the right silicon. The Mini orchestrates and owns the database. The Studio's 256 GB unified memory hosts all four persona models simultaneously. A separate Grace Blackwell box renders the entire visual half of the show, portraits, group scenes, episode video, without touching the trade-decision loop.
FastAPI server, scanner.db owner, scheduler heartbeat. Pulls every external feed, dispatches the persona panel, manages position lifecycle, talks to Alpaca. LAN-bound at 127.0.0.1:8888 since launch, never reachable from the public internet. The whole bot runs from this box.
256 GB unified memory, ~230 GB realistic LLM budget. Runs the OpenAI-compatible oMLX server with all four persona models loaded simultaneously. No swapping mid-debate, no warm-up tax. The single most important hardware purchase the project will ever make.
NVIDIA Grace Blackwell GB10 inside. 128 GB unified memory, 1 PFLOP FP4. The visual half of MoEfolio is rendered here: persona portraits in Flux 2, identity-locked group scenes via chained PuLID + IPAdapter blocks, episode video via Wan 2.2, and per-cycle scorecard PNGs. Also keeps a very large ~130B-parameter open-weights model resident for second-opinion reasoning on high-conviction calls. Deliberately isolated from the trade-decision loop so a slow render never blocks a debate.
"Mixture of Experts" usually means a single model with internal expert routing. Here it means four actually different open-weights LLM families served simultaneously from one 256 GB Mac Studio via oMLX. Same family = same blind spots = correlated wrong answers. Different families produce different priors, different vocabularies, different hallucination modes, so when they agree, the agreement carries information.
Bruce, Meryl, Walter and Layla each run on a different open-weights model family, selected from non-overlapping post-training lineages so their reasoning genuinely diverges. Bull team is Bruce + Meryl; Bear team is Walter + Layla. Donald, the host and post-cycle judge, is the only cloud LLM in the loop, deliberately separated so the trade decisions stay 100% local.
We don't publish which persona maps to which family, they're characters first, models second. The diversity is by construction, the casting is private.
When a verdict resolves to AVOID, a deterministic post-check runs: if the stock is down >40% from its 52-week high and generates positive free cash flow and shows recent insider buying, the verdict is downgraded to HOLD with confidence floored at 45. Counters the panel's natural pile-on bias on distressed-but-survivable names.
Every external string injected into a persona prompt, news headlines, Reddit posts, transcripts, reviews, is wrapped with [external/source] markers. The personas treat anything inside those markers as third-party data, not instructions. Indirect prompt injection from a scraped feed can't hijack a verdict.
Most of these aren't on any other retail dashboard because they're a pain to integrate, heterogeneous APIs, scrapers that break, transcripts that need parsing, regulatory sites built in 2003. We did the engineering. The personas can read them during research cycles, and persistent feeds refresh in the background.
A curated watchlist of investor and macro-analyst YouTube channels, the ones serious money actually listens to. yt-dlp walks each channel's recent uploads, pulls auto-captions, and the personas scan the transcripts before voting on any ticker that was named. Not "did someone say it", "what did they actually argue and was the case good".
Public TG signal channels are loud, promotional, and routinely wrong, but the consensus tells you what retail is being marketed. We poll a watchlist of public channels every 15 minutes, parse out entry / stop / target levels with regex, and surface the cluster of names being pumped. The personas treat it as crowd-pressure data, not trade ideas.
For backtests we need data the way it looked then, not the way it looks now. We pull Wayback Machine snapshots of historical Wikipedia revisions, Companies House officer pages, pre-paywall news articles, reconstructing FTSE 100 constituents pre-2023, director-resignation timelines, and the headlines that hit before they were edited. The result: a 25-year survivorship-corrected backtest universe.
Every senator and representative trade above the disclosure threshold, often within days of relevant committee work. We don't trade off it; we ask the right question, did Pelosi just buy the ticker we're debating?, and let the persona panel weigh the answer. Free, public, and routinely embarrassing.
When a legendary fund opens a new position or zeroes one out, it shows up in EDGAR's 13F filings, and on Dataroma within an hour. That's typically 24 to 72 hours before financial Twitter notices. We cache these walks and refresh them when a research cycle or persona tool asks, so the panel can see smart-money moves without hammering the source.
Federal and state filings via the CourtListener API. Before any BUY recommendation we check whether the company, or its officers by name, appears in active litigation. Securities-fraud class actions, antitrust cases, SEC enforcement actions all surface here. A matched hit doesn't auto-veto, but the panel sees it and weighs it.
"81 sources" is only honest if the feeds are refreshing inside their cadence. This panel reads the live state of every claimed adapter and pipeline. Last updated just now.
Status grammar: fresh = refreshed inside cadence. warming = barely past cadence or just spinning up. stale = significantly past cadence. failing = last attempt errored. disabled = source switched off in settings. unknown = registered but no data observed yet.
Usage grammar: used recently = cited by a panel verdict in the last 24h. fresh, unused = pulling fine but the panel has not cited it in 7 days. stale, but used = past cadence yet still cited in the last 30 days. never used = registered but no panel has cited it in the last 30 days.
Every cycle is the same eight stages, scan, gather, take, huddle, challenge, verdict, judge, execute. Each stage is independently inspectable; every output is logged and traceable back to the inputs that produced it.
Round-robin blended scanner pulls a top-20 pool: 75% alt-scanner output (sector momentum + insider clusters + earnings momentum) and 25% value-screen (below 200-week MA + positive FCF). Symbol cooldown of 4 hours prevents back-to-back debates of the same name.
83 data adapters fan out in parallel for the chosen ticker. Each cached for its own TTL, heavy 13F walks 24 h, news 15 m, quotes 30 s. Adapters silently skip when their source is unreachable; the panel sees the gap, not stale junk.
Each persona writes its verdict in character, calm-quantitative, growth-evangelist, macro-paranoid, sceptical-referee. Each call carries a confidence (0 to 100) and an explicit thesis the validator can grade.
Bull team aligns. Bear team aligns. Internal disagreement collapses into a single team verdict only if both members commit; otherwise the team is split and the asymmetric rule downgrades it.
Layla challenges Bruce. Meryl challenges Walter. The other side responds in real time. A genuine debate, the personas have read each other's openings and react to specifics, not to a templated rebuttal.
A trade fires only when one team commits AND the other doesn't oppose with equal conviction. Otherwise HOLD. Conservative by design, false negatives are cheap, false positives lose paper money in public.
Donald (cloud) grades panel reasoning quality 0 to 100 after each cycle. A separate validation guard runs live during the debate, catching factually-wrong citations (e.g. "Q3 revenue was $X" when EDGAR says otherwise).
OCO bracket on Alpaca paper. Position monitored, exits on time-stop, 50w-MA cross, or verdict-reversal-guard tightening. Every closed trade is linked back to its originating verdict for outcome calibration.
A BUY verdict is necessary but not sufficient. Every committed trade also passes through these eleven gates, any one of them can veto. They're deterministic, fast, and inspectable. The persona panel argues the thesis; these gates argue the math.
min_confidence floor.Fail-CLOSED in live mode: if any signal a gate needs is missing, the trade is blocked rather than waved through. Better a missed BUY than a blind one.
A verdict is a prediction. A closed trade is a verified outcome. We link them, the originating verdict ID is stored on the trade, and when the position closes, the realised P&L grades the verdict retroactively. That signal feeds back into the panel as per-persona vote weights.
For every closed trade we compute the Brier score against the originating persona's stated confidence. Persistently overconfident personas get their vote weight halved; well-calibrated ones keep theirs. The panel's effective confidence is the weighted average of its members' modifiers.
The historical S&P 500 universe is reconstructed from Wikipedia revisions + fja05680/sp500 + Siblis Research, 1,272 distinct symbols across 25 years, including delisted names. Walk-forward backtests use the universe-as-it-was on each historical date, not survivors only.
Per-bucket win rate vs stated confidence, last 60 days of team panel verdicts. The diagonal is perfect calibration; points below are overconfident. Live chart and table at /calibration.
Every BUY verdict that fires a trade gets the trade ID stamped back onto it. Every closed trade resolves the originating verdict's outcome_pnl_pct and outcome_was_correct. Without this linkage the daily learning loop would be wishful thinking.
When a position closes red, a forensic post-mortem runs, names the cognitive bias, identifies which persona's reasoning broke down, and posts the result publicly to the Open Book. Wrong is fine; wrong-and-quiet is not.
The bot doesn't just trade, it produces a daily show. Persona portraits, group scenes, episode video, social cards, and the entire YouTube format are rendered in-house on the Grace Blackwell box. No stock footage, no off-the-shelf templates, no AI-generated slop. The personas have a consistent face across every frame because we built an identity-locked workflow to make sure of it.
Bruce, Meryl, Walter and Layla each have a single canonical portrait set rendered in Flux 2 with carefully-tuned prompts and reference images. Once a face is locked it doesn't drift: every subsequent appearance, episode chyron, social card, podcast thumbnail, uses the same identity reference. The cast is recognisable because we made it stay recognisable.
Standard text-to-image collapses identity when you ask for four named people in one frame. We chained PuLID + IPAdapter blocks with per-persona conditioning so the cast portrait holds all four faces correctly. Iterated through several reference-weight schedules until intra-team identity drift stopped happening.
Episode video, the daily 8 to 10 minute panel format and the 90-second vertical "Crackpot Hour" cuts for TikTok/Reels, is rendered via Wan 2.2. The transcript drives the audio track; the model lip-syncs to it; the canonical portraits anchor identity. Same persona, same voice, same vibe across every episode.
After each debate finishes, a PNG scorecard is auto-generated showing the ticker, both team verdicts, the asymmetric outcome, and Donald's reasoning grade. Auto-posted to the broadcast channels and embeddable on social. The show isn't post-edited, it's generated as the bot thinks.
The US desk is live on Alpaca paper. The UK desk (Sterling Desk) runs overnight UK cycles on FTSE 100 constituents through a UK-paper broker shim. Each desk has its own scheduler, its own throttle, and its own data adapters.
Every signal you see in a panel transcript is traceable to one of these adapters. The cycle gathers the relevant set for each ticker; heavyweight sources are cached or called on demand, and persistent feeds like YouTube, Reddit, Substack, Telegram and podcasts refresh in the background. UK-prefixed sources surface only for FTSE tickers. Adapters silently skip when their source is unreachable, so the persona panel sees the gap, not stale junk.
Most of these are repo-wide invariants enforced at the chokepoint, not aspirations posted in a README. Each one closed a class of past bug.
[external/source] markers. Indirect prompt injection from a scraped feed cannot impersonate the panel.BEGIN IMMEDIATE on every write. The scheduler heartbeat row is filtered out of last-fire queries, a past audit caught a reader missing the filter and double-firing.yf.download(threads=2) always. We were burned once by FD exhaustion wedging the database; the cap is now load-bearing.127.0.0.1. The public site reads from a separate LXC. Cloudflare Tunnel handles ingress with no inbound port on the home network.The four local LLMs that argue every stock pick are served on a Mac Studio M3 Ultra by oMLX , an OpenAI-compatible MLX inference server purpose-built for Apple Silicon. It's the quiet backbone that lets us host four different model families simultaneously without paying a per-token bill to anyone. Thank you to the oMLX team.
The adaptive learning layer that watches every gate decision and slowly learns which contexts deserve confidence vs caution is Syntra, an open-source neural runtime by SectorOPS. Today it runs in shadow mode: it observes every trade-gate decision, suggests a policy, and learns from delayed outcome feedback, but never alters a live trade.
Thanks also to the maintainers of every adapter listed above, FRED, SEC EDGAR, Finnhub, Tiingo, the Reddit data ecosystem, the Wikipedia historical S&P 500 contributors, fja05680/sp500, Siblis Research, the iShares ISF daily-holdings export, slickcharts, and the dozens of other free public sources that make this project possible without a paid API.