TraderDaddy trades the flow. TickerTrace shows you the daily ETF data underneath โ€” free, no login.See the live flow โ†’
LIVE INSTITUTIONAL FLOW ยท 100+ ACTIVE TRADERS

Front-run the institutions.
Before retail gets the memo.

Two products. One funnel.

TraderDaddy shows what the smart money is doing in real time โ€” sweeps, blocks, golden sweeps, decoded by AI. TickerTrace is the daily ETF positioning layer underneath: what 50+ institutional funds are actually buying, normalized and free.

Both products run on the same open API. No signup required to see today's data.

Why retail loses

Speed of information. By the time the public sees institutional positioning, the trade is months old.

What your broker shows you

13F filings. Updated quarterly, published with a 45-day delay. By the time you see it, the trade is 90+ days old and the move already happened.

Filed: Q4 2025 โ†’ You see it: Feb 2026

What this stack shows you

Institutional ETFs publish full holdings every market day. TickerTrace scrapes + normalizes; TraderDaddy layers on real-time options flow.

Daily holdings + per-minute flow โ†’ live edge

The stack

Two layers, one workflow. The free data layer feeds the paid execution layer.

Layer 1 ยท Execution
๐Ÿง 

TraderDaddy.Pro

Real-time options flow detection. Sweeps, blocks, golden sweeps tracked as they hit the tape โ€” with institutional conviction scoring and an AI coach that translates each signal into plain English.

  • SWEEP / BLOCK / GOLDEN SWEEP flow detection
  • TraderLady AI โ€” every flow translated in real time
  • 7 screeners, GEX levels, congressional trades
  • 1-minute refresh ยท 24/7 market coverage
Start Free Trial โ†’
Layer 0 ยท Free Data
๐Ÿ“Š

TickerTrace

Daily ETF holdings, normalized across providers. 50+ institutional funds tracked, every position every day, with cross-fund conviction scoring and divergence detection. No login, no paywall.

  • ARK ยท Avantis ยท YieldMax ยท Kurv ยท REX ยท NestYield ยท Roundhill ยท Corgi
  • Conviction scoring ยท streak tracking ยท sector flow
  • Activity heatmap ยท divergence alerts ยท option decoder
  • Open JSON API ยท same data TraderDaddy reads
Open the Dashboard โ†’

What you get

The free data layer hands you everything below. The paid execution layer turns it into trades.

Conviction Scores

Signals weighted by fund AUM. A $6.8B ARK buy ranks higher than a $50M fund's identical move.

Streak Tracking

Know when an institution has been accumulating a position for 3, 5, or 10 consecutive days.

Activity Heatmap

Visual grid: tickers ร— funds. Color intensity = weight delta. See the whole market in one glance.

Ticker Search

Look up any stock โ€” see every fund holding it, their weights, recent changes, and options exposure.

Divergence Alerts

Flagged when funds within the same family take opposite positions. That's rare. That's a signal.

Discord Alerts

Paste your Discord webhook once. Get the full daily briefing delivered to your server every morning.

๐Ÿ’ฐ ๐Ÿ›ก๏ธ

Option flow, decoded

We translate covered calls and cash-secured puts into plain English โ€” so you know what the fund actually thinks.

Cash-Secured Put
Bullish above $42
Covered Call
Capping upside at $250

The data layer, vs. the alternatives

Other tools charge $19โ€“$500/mo for ETF data. TickerTrace gives it away free โ€” and TraderDaddy turns it into trades. This compares the free data layer to what else is out there.

FeatureTickerTrace13F FilingsETF Research CenterCathie's ARK Tracker
Update frequencyDailyQuarterlyDailyDaily
Data delaySame day90+ daysSame daySame day
Cross-fund coverage14 ETFs, 6 providersAll 13F filersBroadARK only (6 ETFs)
Conviction scoringโœ“โœ—โœ—โœ—
Streak trackingโœ“โœ—โœ—โœ—
Option flow decodedโœ“โœ—โœ—โœ—
Divergence alertsโœ“โœ—โœ—โœ—
Discord alertsโœ“โœ—โœ—โœ—
Activity heatmapโœ“โœ—โœ—โœ—
JSON APIโœ“โœ—$29/moโœ—
Price100% FreeFree$29/moFree

Stop trading 90-day-old data.

Pair the free daily holdings feed with TraderDaddy's live options flow. Same edge institutions pay six figures for โ€” minus the prime brokerage.

Referral link to TraderDaddy disclosed. We use this stack ourselves โ€” we built TickerTrace to feed it.

Patch Notes from the Trenches

We ship constantly and document it honestly. Here's what landed recently.

May 26, 2026feature

Whop app got the polish round it actually needed to ship

Yesterday's commit said "TickerTrace is now a Whop app" โ€” technically true, but it lived on a tickertrace-whop.vercel.app URL nobody could remember, had no icon, and was asking for a comically over-privileged scope list (Create apps, Manage OAuth, Manage webhooks โ€” all "Required", with the justification "Um because I'm making apps duh". Dev-tooling boilerplate that leaked in from my own scaffold.) Today: drew an actual TT monogram icon, pointed tt.mphinance.com at it via an Apache reverse-proxy on Vultr (the subdomain was sitting there from a tastytrade tool I haven't opened in months), and stripped every requested scope to zero โ€” a read-only ETF dashboard does not need to manage your webhooks. Install it into your Whop, click through Signals, watch your members actually use it. It's a real app now.

May 26, 2026feature

TickerTrace is now a Whop app โ€” free, embedded in your community

Spent the day porting the dashboard into a Whop app. Same data, same conviction scoring, same fund and ticker pages, just wrapped in Whop's iframe SDK so it slots into any community as a tab. Five top-level tabs (Signals, Briefing, Changes, Divergences, Sectors), plus full per-fund and per-ticker drill-downs. JWT verification on every page so members are identified through Whop's own auth, no separate signup. Free, no tier gate, no upsell โ€” pointed straight at the public api.tickertrace.pro so there's no second backend to maintain. Lives in whop-app/ in the repo. If you run a Whop and want to give your community a live read on what institutions are buying without making them leave Discord, this is the easy way.

May 21, 2026feature

Divergences got a tug-of-war bar, the CBOE scanner got filters

Two cleanups from the design review. (1) The Divergences section โ€” where one fund is buying a name another fund is dumping โ€” now has a tug-of-war bar under each row: green for total buying pressure, red for total selling, sized to scale. A lopsided fight ('everyone's loading up, one fund is bailing') is now obvious without doing mental math on the percentages. (2) The CBOE Options Scanner had no way to narrow things down โ€” now there's a category toggle (Newly Optionable / Weekly ETFs / Weekly Equities) and a ticker search, so you can jump straight to what you care about instead of scrolling the whole timeline.

May 21, 2026feature

Three new reads on the fund pages โ€” strategy map, rolls, and fund flow

Option-income funds got two new panels and everyone got a flow stat. (1) The Option Strategy Map shows, per underlying, where the spot price sits versus the strike the fund wrote โ€” so you can see at a glance whether a covered call is safe (out of the money, fund keeps the premium) or about to get run over (in the money, shares called away). (2) An Option Rolls panel: when a fund closes one contract and opens another on the same name, that's a roll, not an exit, and it finally reads that way โ€” 'ADI C437.5 โ†’ C415'. (3) Net Flow โ€” the change in shares outstanding over the past week, as a percent. Shares outstanding only move when a fund creates or redeems units, so it's a clean read on whether money is coming in or leaving. We show a percent on purpose: the share counts are trustworthy, the per-share prices our scraper pulls are not โ€” a bad price briefly had a $50M fund showing a $2.9B flow before we caught it. Net Flow appears wherever the provider reports shares outstanding (most option-income and Corgi funds); ARK and Avantis don't publish it, so it stays hidden there.

May 21, 2026bugfix

Activity heatmap behaves itself on a phone now

The big buying/selling matrix on the dashboard was eating most of the screen on a phone, and it wasn't obvious you could swipe it sideways. Trimmed its height on small screens so it's a panel and not a takeover, and added a little 'swipe for all funds โ†’' nudge. The ticker column stays pinned while you scroll, so you never lose which row you're on. Desktop is untouched.

May 21, 2026feature

Fund pages split in two โ€” a value fund and a yield machine aren't the same animal

Every fund page used to look identical, which never made sense. What you want from AVUV โ€” what has Avantis been quietly accumulating? โ€” is nothing like what you want from ULTY โ€” how is the option book positioned? So there are two layouts now, and each fund gets the right one automatically. Active-equity funds (Avantis, ARK, Corgi, Sprott) lead with a Daily/Weekly/Monthly toggle, a New Entrances / Total Exits scoreboard, and a conviction-streak tracker โ€” built to surface what's moving over a week or a month, not just today's noise. Option-income funds (YieldMax, Kurv, REX, Roundhill, the EGG funds) lead with the option book itself: contracts laid out as an expiration ladder, each tagged ITM / OTM / ATM so you can tell at a glance whether the fund's written calls are safe or about to get run over. Also quietly fixed: option open/close activity was being filtered out of the data entirely โ€” it's back, so you can actually watch contracts get opened and closed.

May 21, 2026bugfix

Some fund pages were 404ing โ€” AVUV, GBUG, BLOX โ€” and it was a self-own

Click through to AVUV's profile lately and you got a dead page. Embarrassing, and entirely our fault. The site pre-builds every fund page ahead of time, and if our API so much as hiccuped during that build โ€” a timeout on AVUV's chunky 800-holding payload, a one-off blip on BLOX โ€” a 404 got baked into that page permanently, and it stayed broken until the next deploy. Fixed the whole class of bug: fund pages now build on demand instead of all at once, the API client retries a transient failure three times before giving up, and we finally tell a real 'this fund doesn't exist' apart from 'the API blipped for a second.' The first gets a proper branded page with a search box; the second gets a Try Again button and quietly heals itself on the next visit. No more tombstones.

May 21, 2026feature

Weekly and monthly numbers that are actually weekly and monthly

Three changes, all aimed at making a fund's page tell you what matters. (1) The 'weekly' view was counting files, not days โ€” and since we don't scrape on a perfectly clean Mon-Fri rhythm (weekends sometimes sneak in, holidays leave gaps), 'a week ago' could drift anywhere from five days to nine. It's calendar-aware now: weekly compares against the snapshot closest to 7 days back, and monthly โ€” brand new โ€” against 30. For slower movers like Avantis and ARK, a month is the horizon where conviction actually shows up. (2) New positions and fully-closed ones now wear bright NEW / EXIT badges, with closed tickers struck through, so the real portfolio decisions stop hiding behind the daily +0.02% noise. (3) Options got honest labels โ€” OPENED / CLOSED / ADDED / TRIMMED instead of buy/sell language โ€” because an option closing is usually just an expiry or a roll, not a fund turning bearish. All of it is groundwork: every fund is now tagged either active-equity (the stock pickers โ€” Avantis, ARK, Corgi, Sprott) or option-income (the YieldMax / Kurv / REX / Roundhill yield machines), because those two very different kinds of fund are about to get two very different pages.

May 20, 2026feature

New page: CBOE Options Scanner โ€” catch a stock the day it gets options

Borrowed this one from TraderDaddy and ported the whole thing to Python. Every weekday morning we pull two CSVs straight from CBOE โ€” the full Symbol Directory (~5,300 optionable stocks) and the Available Weeklys list โ€” and diff them against yesterday. Two things it catches: a stock getting options listed for the very first time (rare, and a real tell that liquidity is showing up), and a ticker getting promoted to โ€” or dropped from โ€” weekly expirations. The new /options-listings page shows a timeline of what changed when, running totals, and an MWF Elite box that lights up on Monday/Wednesday/Friday 0DTE days. It doesn't touch any fund holdings data โ€” it's pure CBOE market data, same for everyone. It's in the nav under 'Options'.

May 20, 2026feature

Income funds got a 'Portfolio' panel โ€” the fund's own book at a glance

Open any options-income fund โ€” ULTY, KYLD, the EGG funds, the YieldMax and REX weeklies โ€” and there's a new Portfolio section on its profile page. The idea came from a sister project that tracks a personal options book; here we pointed the same layout at the fund itself. You get four metric cards (equity holdings, option contracts, equity weight, top-sector concentration), a sector-exposure bar built from the underlying equity holdings, and every option position rendered as a card โ€” labeled covered call or cash-secured put, with strike, weight, and days-to-expiry. Negative weight means a written/short contract. It's all computed from the daily holdings snapshot we already had โ€” no new data, just finally showing it properly. Plain-vanilla funds like AVUV and ARKK don't get the panel since they don't write options.

May 20, 2026bugfix

Share buttons that don't get you flagged as a spammer

Every time I tried to share TickerTrace on Reddit, the spam filter ate it โ€” turns out Reddit auto-flags link posts to the same domain as advertising, and we'd wired the share button to do exactly that (a bare link drop). Fixed it properly: the Reddit button now opens a TEXT post with a real writeup pre-filled, including an honest 'full disclosure, it's my project' line โ€” which is the thing that actually keeps a subreddit from nuking it. Substance plus transparency reads as a contribution, not an ad. Same fix on the dashboard's share row. Also added a plain 'Copy link' button everywhere, because the one share method no algorithm can flag is the one where you paste it in yourself.

May 19, 2026feature

Dashboard UX pass โ€” heatmap pivot, KPI tiles, clickable tickers, banished webhook config

Friend with actual design taste sent over a critique; he was right on every count. Four changes: (1) Activity heatmap pivoted โ€” tickers are now ROWS, fund columns grouped by provider with a colored band header and thin separators between families. Two-tier sticky header (provider band + fund row), sticky ticker column, dense 16px cells with a real hover tooltip instead of the browser's slow native title. Click a ticker to jump to its cross-fund view; click a fund to open its profile. (2) Backtest section is now three proper KPI tiles with win-rate progress bars, not text-heavy paragraphs. (3) Every ticker in Top Buys, Top Sells, Multi-Provider, Streaks, Notable Options, the Buying/Selling hero list, AND divergences is now a real link โ€” click it and the cross-fund lookup populates instantly. (4) The Discord webhook configurator was hogging prime real estate right under the search bar โ€” moved into an 'Integrations & sharing' collapsible at the bottom of the page, alongside the X/Reddit share buttons. Config doesn't belong above the fold.

May 19, 2026feature

Live visitor counter pill on every page

Bottom-left of every page now shows 'โ— 7 live ยท 412 today ยท 2.8k/wk ยท 18k total' (or whatever the actual numbers are). It's a tiny FastAPI endpoint backed by a SQLite table โ€” fires a sendBeacon on each page load and polls /api/v1/visits/live every 30 seconds. Visitor identity is sha256(ip + salt)[:16] so no IPs are stored. Rolls a 30-day window for the rolling stats; lifetime counter persists. The Sam-voice version: turns out the most engaging analytics is the one you don't have to log into.

May 19, 2026feature

Ask TickerTrace now works with whatever LLM key you happen to have

Provider dropdown for Gemini, Anthropic, OpenAI, or OpenRouter. Pick one, paste the matching key, ask away โ€” each provider's API gets called direct from your browser, no server in the middle, key stored only in localStorage. The settings panel shows a 'key saved' dot next to providers you've already configured so you can switch around without re-pasting. Model field is optional with a sensible default per provider, but you can override it (gpt-5-mini, claude-sonnet-4-5, google/gemini-2.5-flash on OpenRouter, whatever). All eight TickerTrace tools work with all four providers โ€” same tool definitions, three adapters that translate to each one's native function-calling format.

May 19, 2026feature

Finally hooked up the GA property that was hiding in Firebase

Turns out we already had a Google Analytics 4 property from the old Firebase setup โ€” it just wasn't wired to the site. Added @next/third-parties Google Analytics component reading NEXT_PUBLIC_GA_ID from env. Set the measurement ID in Vercel and we get real funnel data alongside Vercel's pageview counts. Two analytics tools talking past each other is fine; they're complementary.

May 19, 2026feature

Ask TickerTrace is BYOK now โ€” bring your own Gemini key

Original version used Claude Sonnet through a server route with our API key. Cost-per-question would have been real money at scale, and Sonnet is overkill for 'who's buying GOOGL'. Pivoted: swapped to Gemini 2.5 Flash, ripped out the server route entirely, made the whole thing browser-side with a BYOK API key. Get a free key at aistudio.google.com, paste it in, your key never leaves your browser (literally stored in localStorage, we have no way to see it). The Anthropic SDK got deleted alongside the change.

May 19, 2026feature

Wired up Vercel Analytics โ€” turns out we had zero visibility into traffic

Embarrassingly: until now we had no idea how many people were hitting this site, what pages they were bouncing on, or where they came from. Added Vercel Web Analytics (privacy-respecting, no cookies, free tier covers anything we're doing). One import in the layout, one component. Should have done this on day one.

May 19, 2026feature

Ask TickerTrace โ€” a chat box that actually knows what it's talking about

New 'Ask TickerTrace' card on the dashboard. Powered by Claude with tool use, backed by 8 tools that wrap our own API: signals, changes, fund detail, ticker detail, sector flow, divergences, signal performance, fund list. Ask 'who's accumulating GOOGL', 'show me ARK's biggest moves', 'do these signals actually make money' โ€” get real answers with real numbers pulled from real holdings data. The reason most AI chat boxes on fintech sites are useless is that they have no proprietary data to ground on. We do. Requires ANTHROPIC_API_KEY in Vercel env to enable; gracefully shows an error if not configured.

May 19, 2026feature

Did the signals work? Now there's an honest answer.

Backtested every historical buy and sell signal against the underlying's price 30 days later. 23,365 graded signals so far. Headline: buying signals win 56.8% of the time with a +2.09% median return. Selling signals lose money (the underlying went UP +4.06% on average after a sell, win rate just 33.8%). Per-fund-family breakdown on the dashboard. New card right at the top because if our signals don't work, you should know. Cron regenerates this daily and the JSON ships as a static file โ€” the dashboard reads it directly, no API call needed. Options-based signals are excluded for v1 (their P&L depends on ฮ”/ฮธ/ฯƒ, not just spot price).

May 19, 2026bugfix

Deleted ~3,000 lines of dead Firebase/Stripe/auth code

The patch notes have said 'Stripe + Firebase ripped out' for weeks but the components, the AuthProvider wrapping the whole tree, and firebase as a dependency were all still riding along. Cleaned house: deleted auth-context / auth-modal / auth-button / pro-gate / lib/firebase / the entire shared-auth/ parallel implementation. Removed firebase from package.json (and 67 transitive packages with it). Side effect catch: the dashboard had been double-rendering signals (top-3 'free' slice followed by the full list inside a no-op ProGate). Build dropped from 49s to 19s. Net: -3,046 lines.

May 18, 2026bugfix

Cross-fund ticker lookup was showing every Corgi fund 8 times

If you searched any stock that a Corgi fund holds, the result card was repeating the same fund up to 8 times with slightly different weights โ€” 6,294 duplicate rows across 619 (fund, ticker) keys, all from Corgi Funds. Turns out the Corgi JSON API returns the full historical time-series, not just today's snapshot, and the scraper was dumping every row into the daily CSV. Fixed at the source (scraper now collapses to the latest holding_date per fund/ticker before writing the CSV) and added a defensive dedup at the API read layer so existing dirty data displays correctly without waiting for tomorrow's scrape. Added regression tests so this exact shape of bug can't sneak in via a future provider.

May 18, 2026feature

Made the ticker search and its results actually navigable

The search bar was tucked into a cramped row with the Discord webhook and share buttons; first-time visitors had no idea you could look up any ticker. Promoted it to its own labeled row with a clearer purpose hint. The result card was also a dead-end โ€” you'd see CMAG and CQTM listed as holding GOOGL but had to copy-paste 'CMAG' into the URL to actually see what else CMAG holds. Now the fund badges in the result are clickable links to the fund's profile page.

May 16, 2026bugfix

Frontend was calling the wrong API hostname this whole time

The dashboard was pointed at api.tickertrace.mphinance.com โ€” which has no Apache vhost on Vultr, so requests fell through to a default vhost that serves the wrong TLS cert AND can't reverse-proxy to FastAPI. Result: 503s on every API call, and the build failing because it couldn't fetch fund metadata. The actual working domain has been api.tickertrace.pro all along (real vhost, valid cert, ProxyPass to localhost:8100). CLAUDE.md had been lying about it being the 'only working' domain. Flipped lib/api.ts, next.config.ts, fund-effectiveness.tsx, effectiveness/page.tsx, and the two landing/dashboard API doc links back to .pro. Local build now generates all 56 fund pages cleanly.

May 16, 2026bugfix

Vercel builds no longer brick when the API is unreachable

The dashboard and fund pages had empty-state fallbacks for null payloads, but the default apiFetch was throwing on network errors and non-2xx responses โ€” so the fallback never got a chance to render. Made apiFetch swallow network errors when throwOnError:false is set, threaded that option through dashboard's signals/activity calls, and wrapped fund/[ticker]'s generateStaticParams in try/catch. Builds now pass even if the API is hung, 503-ing, or unreachable. Pages render on demand once it's back.

May 16, 2026bugfix

README finally caught up to reality

The README was last touched March 2 and was lying about basically everything: said we tracked 15 funds (it's 56), said the API needed an API key (it's been fully open since v2), said the data layer was holdings.ts (it's lib/api.ts now), still had a whole Authentication section for Stripe and Firebase (both ripped out months ago). Rewrote it. Added the missing endpoints, the MCP server section, three screenshots near the top, and the current gotchas list. The old one was a trap.

May 16, 2026bugfix

Discord webhook preview was also broken (s.funds is string[])

Two preview rows in the dashboard embed card still did s.funds.map(f => f.fund), assuming the pre-review-#10 object shape. ApiSignal.funds is a plain string array now. The equivalent fix landed for the text-format path in commit 969b874 but missed these two JSX lines. Same one-liner: just .join(', ') the array.

May 16, 2026bugfix

Unbroke the Vercel build (ApiApiChangeRecord)

Fund profile page had ApiApiChangeRecord in the import โ€” Api repeated, classic. TypeScript caught it, Vercel red-X'd the deploy, the fund pages would have been broken if it hadn't. Renamed to ApiChangeRecord (the actual export) in the import and the function signature. Build's green again.

May 16, 2026feature

Landing page reframed as a stack pitch

The free TickerTrace dashboard is no longer the headline product on the landing page. TraderDaddy is the execution layer, TickerTrace is the free data layer underneath. Two CTAs above the fold โ€” try the data, or pay for the trades. Dropped the Founders Partner section and the 'request a fund' callout (nobody used them); kept the comparison table and Patch Notes because both still earn their space.

May 16, 2026feature

Dashboard now renders from the API (P1 #10 finale)

The dashboard, changes page, and fund profile pages all fetch from the FastAPI server via lib/api.ts instead of recomputing in TypeScript. One source of truth, real customer of our own API, no more drift between TS and Python. Added /api/v1/briefing, /api/v1/activity, and /api/v1/holdings endpoints to cover everything the dashboard needs. Ported the significance threshold, streak tracking, and option-signal decoder to Python with snapshot tests. holdings.ts is now reduced to static reference data (FUND_PROVIDERS, FUND_AUM, PROVIDER_ORDER) plus the single raw-row consumer at /holdings.

May 16, 2026feature

Corgi Funds went live โ€” 16 thematic ETFs in the data

Manually triggered today's scrape to bring in the Corgi Funds family that was added to the scraper this morning. EUV, CMAG, CQTM, XA, EYES, KYC, GNMX, AV, DOCK, WATS, GLAM, NYNY, STYL, WNDR, FDRS, FDRX. NYNY returned 530 holdings on the first try. Whoever built their API actually shipped it before launch โ€” that's rare.

May 16, 2026feature

tickertrace.pro/api/signals now proxies to FastAPI

The legacy /api/signals route used to recompute the entire signal payload in TypeScript from the CSV files โ€” a parallel implementation of api/data.py. It now proxies through to the FastAPI server. One source of truth for the public JSON, and external consumers (agents, your other service) get the exact same data as the dashboard. Also shipped lib/api.ts โ€” a typed TS client for the whole FastAPI surface, ready for future migrations.

May 16, 2026feature

CI exists now โ€” finally

Added a GitHub Actions workflow that runs pytest and next build on every push and PR. Also runs an AST parse check on the key Python files because the one time I trusted myself, I shipped a half-truncated data.py. Never again. Catches breakage before it hits Vultr.

May 16, 2026feature

Tagged endpoints in /docs

The Swagger page used to be one undifferentiated wall of endpoints. Now they're grouped: public (the data), marketing (the TraderDaddy hand-off), auth (vestigial email/password endpoints). Easier to scan when you're trying to figure out what this API actually does.

May 16, 2026feature

Scraper now retries when fund providers cough

Wrapped every HTTP fetch in the scraper with exponential-backoff retry (3 attempts, 2-10s waits). Used to be: REX returns a transient 503, we lose ULTI for the day, dashboard goes dark on that fund until tomorrow. Now: it retries quietly and keeps going. Skipped parallelizing the loop โ€” the CUSIP resolver caches to a JSON file and concurrent writes would corrupt it. Worth doing eventually.

May 16, 2026feature

Structured logs with request IDs

The API now emits JSON log lines with a request_id, path, method, status, and duration_ms attached to every entry. docker logs tickertrace-api is now greppable. Every response also carries an x-request-id header โ€” when something breaks you can correlate the client error to the exact server log line that produced it.

May 16, 2026feature

55 new tests โ€” the data layer can't drift anymore

Added tests/fixtures/ with two days of synthetic holdings CSVs, plus tests for compute_daily_changes, get_signals, get_divergences, get_full_payload, and 38 cases on the junk-ticker filter. Includes a regression guard that fails the build if get_full_payload ever recomputes the changes list more than once (the bug we just fixed). pytest tests/ now exists as a thing.

May 16, 2026bugfix

Stopped committing the SQLite binary

GitHub Actions was happily git add'ing data/holdings.db every day. A binary file that diffs to garbage. Bloating the repo by ~1MB/day. Gitignored it. The scraper rebuilds it from CSVs anyway.

May 16, 2026feature

tickertrace.pro/api/v1/* now works

Added a Next.js rewrite so the Vercel domain proxies /api/v1/* to the FastAPI server on Vultr. One domain to advertise instead of two. The Next.js /api/signals route (no v1) still works as before โ€” Next prefers local routes over rewrites.

May 16, 2026feature

API v2 โ€” ripped out Stripe + Firebase, hardened the rest

If we're not charging anyone, we don't need Stripe. If everyone's getting in, we don't need Firebase. Both are gone from the API and the Docker image. Also: tightened CORS to an actual allowlist, threaded SQLite connections (no more open/close per call), moved DB init into FastAPI lifespan (no more racing migrations on startup), and added per-IP rate limits to the public endpoints because the whole thing is open now and we'd rather not get hammered.

May 16, 2026feature

Stopped recomputing the same data four times per request

The /api/v1/signals endpoint was calling compute_daily_changes() four times โ€” once for signals, once for changes, once for sector flow, once for divergences. Each call re-read the CSV. Now it computes once and threads the result through. Free speed.

May 16, 2026bugfix

Junk-ticker filter was paranoid

The old filter said 'if it ends in XX, it's junk'. That's true for FGXXX and SPAXX. It's also true for any random ticker someone might list ending in XX. Replaced the tower of heuristics with a positive allowlist on ticker shape (starts with a letter, 1-10 alphanumeric chars). CUSIPs and identifiers fail this naturally; real tickers pass.

May 16, 2026feature

Threw the paywall in the trash

Auth UI is gone. No login, no API key, no Pro tier. Everything's free โ€” every endpoint, every signal, every fund. We're feeding this data into TraderDaddy.Pro anyway, so we figured we'd just open the spigot. Code for auth is still there; we just stopped rendering it. If we change our minds, it's one import away.

May 16, 2026feature

Pointed at TraderDaddy.Pro โ€” that's where this data goes to actually trade

Added a ribbon, a button, and a hand-off card on the landing page. TickerTrace tracks what they're buying. TraderDaddy is where you do something about it. Yes, the link has a referral code. Yes, we tell you it's a referral link. We're trying to be decent.

May 16, 2026bugfix

Stopped advertising '$15/mo Pro' that nobody was being charged for

The pricing card was lying to people. Replaced it with a 'The Data โ†’ The Trade' card pair that's actually honest about what's free (everything) and where to go next (TraderDaddy). Also caught one comparison table row still saying 'Free / $15mo' โ€” that's been there for weeks.

Mar 4, 2026feature

Strategy-aware effectiveness scoring

Every option-income fund now has a strategy profile pulled from its actual prospectus. BLOX selling ATM calls? That's on-strategy โ€” not a penalty. EGGS mandates hedging? The hedge ratio metric now weighs 25% for them, 8% for funds that don't. Scoring finally matches what the fund says it does.

Mar 4, 2026feature

Institutional-grade effectiveness engine

Rebuilt the entire scoring system from scratch. Black-Scholes Greeks, notional-weighted scoring, continuous Gaussian curves instead of step-function cliffs. Seven metric categories: strike selection, DTE management, spread efficiency, roll behavior, premium capture, hedge ratio, concentration risk. A DTE of 6.9 and 7.0 now score almost identically. As they should.

Mar 3, 2026feature

Added EGGQ, EGGY, EGGS โ€” NestYield enters the chat

Three new active equity + options overlay ETFs from NestYield (Tidal). EGGQ does OTM call spreads on tech. EGGY targets 25% yield with selective covered calls. EGGS hedges with laddered puts and targets capital preservation. Scraper, API, dashboard, and effectiveness engine all updated in one session.

Mar 3, 2026bugfix

Junk ticker filtering was lying to us

Found stale provider maps and inconsistent junk filtering. Some tickers were getting through that shouldn't have been, others were being eaten. Centralized everything into _is_junk_ticker() and applied it everywhere. Also cleaned up the fund profile categorization because the old one was held together with hopes and dreams.

Mar 2, 2026feature

Share buttons on the dashboard

Added X and Reddit share buttons right next to the Discord webhook. Your friends should know what ARK is doing. Also quietly fixed every single URL still pointing at the old Vercel subdomain โ€” 10 references, 6 files. The domain has been tickertrace.pro for weeks. We noticed.

Mar 2, 2026bugfix

ULTI fund was invisible for a full day

The REX CSV returns holdings under the internal name 'REX_ULTI'. Our scraper trusted the source data. That was a mistake. Then our CUSIP resolver labeled every ticker 'OTHER'. 'OTHER' is in our junk filter. 88 rows, zero visible. Three engineers, zero brain cells.

Mar 2, 2026feature

Custom domain: tickertrace.pro

We bought the domain, pointed DNS at Namecheap, then our AI tried to fight Apache for port 80 by installing nginx. On a server that already had Apache. It lost. We used Apache instead. SSL via Let's Encrypt.

Mar 2, 2026feature

Firebase Auth (Google sign-in)

Replaced our hand-rolled auth with Firebase. Had to generate a service account key from the console because gcloud wasn't installed. The AI tried to navigate the Firebase console in a browser. It could not. Instructions were given instead.

Mar 1, 2026feature

Added ULTI, SLTY, BLOX funds

Three new ETFs in one session. ULTI (REX Shares) required a POST request to download CSV. SLTY (YieldMax) just worked. BLOX was fine until we realized their CSV uses 'Account' as their ticker column. Scraper didn't care. Dashboard did.

Mar 1, 2026bugfix

Stripe checkout button did nothing

The 'Upgrade to Pro' button was pointing to localhost:8100. On production. For 12 hours. Nobody noticed because we didn't have any users yet. Fixed by someone who was definitely not the same person who wrote it.

Feb 28, 2026feature

CUSIP โ†’ Ticker resolver

Some funds only publish CUSIP identifiers (9-char codes), not ticker symbols. Built a cache + OpenFIGI fallback. Cache hit rate: ~95%. Cost: $0. Time spent debugging why 'N97284108' wasn't resolving: too long.

Share it โ€” the Reddit button posts a real writeup, not a flagged link