How it works ?
From daily market data to a shortlist of persistent swing signals.
- 01
Calculate
Market data → quantitative prefilter
- 02
Evaluate
Daily candidates → Grok analysis
- 03
Compare
7 days of signals → HOT / WATCH
1. The strategy: find a trend that is still early
The scanner looks for rising prices supported by volume, improving market-cap ranks, and signals that repeat across several days. A large daily gain can be a valid start when volume confirms it, and strong 30-day momentum on orderly volume is a positive; a move that has gone parabolic or is running on climax volume is less attractive.
The daily run targets 250 eligible assets by market capitalization from CoinGecko, with prices and volumes in USD. Known stablecoins and configured exclusions are removed. Newly discovered assets are classified before admission: only the crypto category is accepted, excluding products such as tokenized funds, stocks, wrapped assets and indexes. Previously tracked assets without a classification remain eligible. Failed classifications stay pending for a later run.
Each daily snapshot records price, market cap, 24h volume and, since mid-September 2026, the 24h high and low. Historical ranks are recalculated by market cap among the assets available in the database, so they can differ from CoinGecko’s global ranks. A positive rank change means the asset has moved up the ranking. Each asset also carries its CoinGecko categories; the first one is treated as its sector.
Beyond the score inputs, the daily calculation derives realized volatility over 7 and 30 days and their ratio (a low ratio is a volatility squeeze), the asset’s 30-day momentum percentile among all tracked assets, its extension above the 30-day average, the age of its 30-day high, a 3-day volume trend, the FDV-to-market-cap ratio, and the median 7-day change of its sector peers. A daily market row records breadth (share of assets above their 30-day average, share up over 30 days), market medians and Bitcoin’s own 7- and 30-day change. These feed Grok, not the score, until they have been backtested.
2. The calculated score
The prefilter starts at zero and adds or subtracts the points below. Its maximum is 11; it can be negative. It is separate from the Grok scores, which run from 1 to 10.
| Signal | Points | Exact condition |
|---|---|---|
| Uptrend | +2 | The 30-day price change is positive and the price is above its 30-day moving average. |
| Breakout | +2 | The price reaches or exceeds the highest daily snapshot price of the previous 30 days, excluding today. |
| Volume confirmation | +2 | 24h volume is at least 1.3× its 30-day median, or is up at least 25% versus 7 days ago. |
| Rank improvement | +1 | The asset’s calculated market-cap rank has improved over 30 days. |
| Early trend | +1 | The uptrend condition is met and the move does not qualify as late. |
| Strong momentum | +1 | The price is up at least 60% over 30 days without qualifying as late. |
| Digested momentum | +1 | Strong momentum whose last 7 days moved between 0% and +10%: the gain has been absorbed rather than just made. |
| Relative strength | +1 | (price today ÷ price 30 days ago) divided by the same ratio for Bitcoin is above 1, i.e. the asset outperformed Bitcoin over 30 days. Skipped, not penalized, when Bitcoin data is missing. |
| 7-day spike | −1 | The price is up 25% or more over the last 7 days. The move itself is not the problem; its first week is a poor entry point. |
| Late extension | −2 | The price is up at least 100% over 30 days, or at least 60% with 24h volume at 3× or more its 30-day median (climax volume). |
Example: uptrend (+2), breakout (+2), confirmed volume (+2), improving rank (+1) and an early trend (+1) produce a score of 8. An asset up 80% over 30 days on 1.9× its median volume while outperforming Bitcoin also earns strong momentum (+1) and relative strength (+1): 10, and 11 if its last 7 days only added 0–10%. If instead those 7 days jumped 30%, the spike costs one point: 9. The same 30-day move at +120%, or on 3× volume, is a late extension: 8 − 1 − 2 = 5, below the daily threshold. Without the breakout, the first example scores 6 and still passes. Candidates with equal scores are ordered by their 30-day price change.
Price and volume changes use (current ÷ past − 1) × 100 at the exact historical date. Moving averages and median volume include today and require every day in their window. If any required prefilter input is missing, the score stays unavailable; missing values are not replaced with zero or a nearby date. Neither a sharp 24h gain nor a lower volume than a week ago carries a point penalty: a price that holds on declining volume after a spike is a consolidation, not a weakness.
Why these thresholds
The rules were checked against one year of daily snapshots (August 2025 to September 2026, a period in which Bitcoin fell about a third) by recomputing the score for every asset and day, then measuring what happened over the following 14 and 30 days. Assets up 60–100% over 30 days on 1.3–3× their median volume went on to gain 20% or more 27% of the time, against 8% for the market as a whole, with a median outcome of −1% and a 21% chance of a 20% drop. The same 30-day gains on 3× volume or more, and any move beyond +100%, had a clearly negative median and more 20% drops than 20% rallies. Days flagged for declining 7-day volume did no worse than the rest.
Timing matters more than the move itself. Among all candidates, the day of a 25%+ weekly spike had a median outcome of −7% over 14 days and a 43% chance of a 20% drop over 30 days, whatever the score. The same strong 30-day momentum whose last week only moved 0–10% kept the 27% rocket rate with a flat median and fewer drops. Assets at the maximum score without a weekly spike had a positive median: +3.5% over 14 days and +5.2% over 30. This is why the score rewards digested momentum and deducts a point on spike days: the asset comes back as a candidate once its week has settled.
The relative-strength rule did not show a measurable edge in this period: with Bitcoin falling, almost half of all days beat it. It is kept as a structural rule and should be re-examined in a rising market. Assets that left the tracked top have no later price in the database, so the crash rates above are understated. The figures describe one market regime and are a guide, not a promise.
3. The daily Grok analysis
The automatic run selects up to 60 assets with a calculated score of at least 6, highest scores first (ties ordered by 30-day price change), skipping assets already scored for that date. Grok receives the asset’s identity, categories and short description, all the metrics above, a 14-day series of daily price changes and volume ratios, and the day’s market context (market and sector medians, breadth, Bitcoin). The model runs at low temperature so the same data yields the same verdict.
Grok is told not to re-derive the prefilter but to do what code cannot: read the shape of the 14-day series, check coherence between signals (volume rising while price stalls, wash-trading hints from volume to market cap, unlock overhang from FDV to market cap) and place the move in its market context. Besides the score it returns a setup label — breakout, pullback in trend, reversal, blow-off or none — and p(+20% 14d), its probability that the price is at least 20% higher in 14 days. Both are stored, so they can be compared with what actually happened.
1–3
Not interesting
4–6
Neutral
7–10
Interesting
These are the scoring bands in the model instructions. Grok is told that strong 30-day momentum on orderly volume is a positive rather than a warning, that the best entries are such moves whose last week only added 0–10%, that the day of a 25%+ weekly spike is a poor entry, that a parabolic move, climax volume or a gain without any volume support should be penalized, and that lower volume than a week ago while the price holds is consolidation. Grok returns a score, a separate “interesting” flag and a written reason. The next stage counts that flag rather than deriving it from the score. The AI assessment has no fixed arithmetic formula, and an unscored asset is not automatically a negative signal.
Explore the daily scores →4. How HOT and WATCH are selected
After daily scoring, the meta-analysis reviews today and the previous 6 days. An asset needs at least 2 days marked interesting to qualify. These days do not need to be consecutive, and 7 complete analyses are not required.
Rank the candidates by persistence and freshness
Available Grok scores receive weights of 1.0 today, then 0.9, 0.8, 0.7, 0.6, 0.5 and 0.4 going back to day −6. The weighted average is the sum of score × weight divided by the sum of weights for the available analyses.
Candidate rank score = weighted average + 0.35 × min(interesting days, 4) + freshness bonus − staleness penalty
The bonus is +0.5 if the latest interesting signal is today, +0.25 if it was yesterday, otherwise zero. The penalty is 1 if that signal is more than 3 days old. The top 40 candidates are sent to Grok for comparison.
Grok compares the candidates together using their daily reasons, signal history and latest available metrics. It assigns a new meta score from 1 to 10 and a verdict. The candidate rank score orders the shortlist; it does not directly decide the verdict.
- HOT
- A persistent, recent, still-early signal that stands out from the other candidates. Grok is instructed to select at most 8.
- WATCH
- A promising setup with incomplete confirmation. It remains worth monitoring, without qualifying as HOT.
- NOT HOT
- A reviewed candidate that the comparison did not retain as HOT or WATCH.
There is no hard meta-score threshold that automatically makes an asset HOT or WATCH. Retained setups include a reason, thesis, horizon and invalidation condition. The home highlights HOT assets; the meta history shows the detailed verdicts and, once 14 and 30 days have passed, the realized return after each one. A completed run can legitimately select no HOT assets.
Explore the meta history →5. Cron jobs and update timing
Every day at 01:10 UTC
One Vercel cron is configured: 10 1 * * *. This is 02:10 in Paris in winter and 03:10 in summer. This is the scheduled start, not a guaranteed completion time.
- Collect. Fetch eligible CoinGecko assets and save the day’s market snapshots.
- Complete history. Attempt to retrieve 365 days for up to 10 assets awaiting backfill per run.
- Calculate. Recompute ranks, swing metrics, prefilter scores, the market context row and dates of entry into the tracked top. The same calculation can be replayed over the full history, which is how the scoring rules are backtested; Grok scores are never recomputed retroactively.
- Measure. Fill the realized 7-, 14- and 30-day returns of every past metric row whose date has been reached. They appear on asset pages, on each HOT / WATCH verdict in the meta history, and in the aggregate “what happened next” box on that page.
- Evaluate in the background. Inngest processes the selected Grok candidates in batches of 3, saving progress between batches.
- Compare. After all scoring batches, run the 7-day meta-analysis and save the HOT / WATCH verdicts.
- Refresh. Data caches are invalidated after ingestion and scoring updates. A separate background task fills missing descriptions for up to 8 assets.
Grok and description tasks are triggered by events, without additional daily cron schedules. Inngest allows up to 2 retries for failed worker executions; an individual scoring error can leave an asset unscored while the rest continue. Market data can therefore appear before AI results are ready. Check the displayed dates and analysis status: the scanner uses daily snapshots, not a live price feed.