How it works

Pulse is a loop and a stream writing to one archive. This page states every rule and threshold the code actually uses, so you can predict what a token's status or a wallet's score will be and change the rule if you disagree.

The two inputs#

Everything in the archive arrives by one of two paths.

One process runs both, plus the API, the dashboard and the scheduled jobs. See the diagram on the home page.

A collection cycle, step by step#

  1. Refresh native prices (SOL and ETH in USD).
  2. Fetch observations: Jupiter lists (recent and the toptrending, toptraded and toporganicscore categories over 5m, 1h, 6h and 24h), DexScreener boosts, latest boosts, profiles and takeovers, GeckoTerminal trending and new pools, pump.fun lists, and Robinhood Chain tokens.
  3. Merge observations of the same token. Several providers describing one token in a cycle become one snapshot, later providers filling gaps, with the source names joined by +.
  4. Upsert tokens, write token_snapshots, list_appearances and pairs, and track each token's all-time high market cap.
  5. Write market_snapshots per chain.
  6. Recompute lifecycle status.
  7. Classify tokens that are new or changed.
  8. Run due jobs: wallet label import, wallet scoring, the newsletter.

A source that fails is logged and skipped. The rest of the cycle still completes, and the failure count is stored in collector:last-cycle.

Token lifecycle#

Every token has a status: new, running, graduated, dying or dead. Status is recomputed in SQL each cycle with these exact rules. When more than one rule matches, the higher row wins.

StatusA token gets it when
deadAny of: its all-time high market cap was at least $20K and market cap is now 10% of that or less. Liquidity is under $1K and its ATH was at least $20K. It has had no snapshot for 3 days, 24h volume under $1K and is not new.
dyingAny of: ATH at least $50K and market cap now 30% of ATH or less. Peak 24h volume at least $100K and current 24h volume under 10% of that peak.
runningAll of: market cap at least $100K, 24h volume at least $50K, a new ATH within the last 24 hours, and market cap at least 60% of ATH.
graduatedIt has a graduation time (it left its bonding curve for a DEX pool) and is currently new or running.
newThe default for anything seen that matches none of the above.

Tech versus meme classification#

Pulse is built for a reader who cares about technology more than memes, so every token gets a category and a tech_score between 0 and 1. It is a transparent keyword and signal scorer, not a model, so a result can always be explained.

Scoring#

  1. Start at 0.4.
  2. Add 0.2 for each technology category the token's name, symbol and description match, capped at three matches. The vocabulary has 13 technology categories.
  3. Subtract 0.2 for each meme category matched, capped at three. The meme categories are meme, animal, culture, politics and celebrity.
  4. Add signals of substance: +0.15 for a website, +0.1 for a description over 120 characters (+0.05 more over 300), +0.1 if the token is verified, +0.15 for documentation-style words, +0.05 for a verified, strict, liquid-staking or community tag.
  5. Clamp to the range 0 to 1.

Category#

If the score is at least 0.5 the category is the best-matching technology category. Otherwise it is the best-matching meme category. With no match at all, the category is tools when the score is at least 0.6, else unclassified. Filtering with tech=1 in the API means score at least 0.6 and a category outside the meme set (and not unclassified).

Tokens are classified when they have never been classified, or when they were seen more than six hours after their last classification, up to 2000 per cycle. Classification looks only at text the token published about itself, which can be wrong or deceptive. It is a first filter for human judgement, not a verdict.

Wallet scoring#

Pulse imports public KOL and smart-money wallet labels once a day. It scores wallets hourly from the positions it has recorded for them over a rolling 30 days. Scoring is Solana only, with profit measured in SOL.

TermDefinition
PositionOne wallet and one token: SOL bought, SOL sold, tokens bought, tokens sold, first buy time and market cap.
Unrealized valueTokens still held multiplied by the token's last price, converted to SOL.
WinA position where SOL sold plus unrealized value exceeds SOL bought.
Win rateWins divided by tokens traded.
Early hitA first buy under $50K market cap on a token whose all-time high reached $500K or more.

The Pulse score combines them:

score = win_rate * 40
      + 15 * log10(1 + max(pnl, 0))
      + min(early_hits, 10) * 5
      + min(tokens_traded, 20)

where pnl is realized plus unrealized profit in SOL. Win rate is worth up to 40 points, profit has diminishing returns through the logarithm, early hits are worth 5 each up to 10, and breadth of at least 20 tokens adds up to 20. Scores are stored in wallet_scores with the win rate, early hits, best multiple and USD profit.

Promotion to smart money#

A wallet that has at least 3 early hits and a win rate of at least 50% is inserted into wallets as kind smart with source pulse:discovered, whether or not it appeared on any public list. The set of smart wallets therefore grows from evidence in your own archive.

Scores need trades. A wallet's score is null until Pulse has recorded positions for it. On an archive built with --no-stream the collector never sees individual trades, so labelled wallets show without scores. Run with the firehose on.

Trade persistence#

The firehose sees every pump.fun and PumpSwap trade, but storing all of them would bury the signal. Pulse keeps the trades that carry information, tagged with a reason:

ReasonKept when
wallet:kol, wallet:smartThe trader is a labelled wallet. Every one of its trades is kept.
whaleThe trade is 5 SOL or more.
early:graduatedOne of the first 40 buyers of a token that later graduated. They are held in memory until the graduation, then written.
early:runnerOne of the first 40 buyers of a token that later became running.

Robinhood Chain#

Robinhood Chain (chain id 4663, an Arbitrum Orbit chain) is read over JSON-RPC. Pulse walks the factory logs of its launchpads (pons, noxa, odyssey) from a saved block cursor, records launch events, and refreshes market data for the tokens it has found. The same lifecycle and classification rules apply. There is no firehose or wallet scoring on this chain yet.

Dashboard and API#

The dashboard is a static single-page app served by the same process. Every view is backed by the public JSON API, so anything you see you can also fetch, and the MCP server exposes the same data to agents.