watches every pump.fun and raydium-launchpad launch · snapshots the first 60 seconds · scores with claude · no trading, just verdicts
what she does · how it works · heuristics · quickstart · config · roadmap
naomi is an autonomous forensic analyzer for solana token launches. open source, mit-licensed. she does three things, in order:
- listens to new token creations on pump.fun and raydium-launchpad in real time.
- snapshots the first 60 seconds of each token's life: distinct buyers, jito-tagged bundles, sniper pubkeys, dev self-buy, holder concentration after the window.
- scores the snapshot with claude and emits a verdict: alert, watch, or ignore.
naomi does not trade. she does not hold keys. she watches and reports. plug her into a stdout console, an append-only jsonl log, or a webhook for your alert pipeline.
the load-bearing change in v0.2 is the first 60 seconds scope. the eth-era naomi reported on a token at the moment its pair was created. the solana naomi reports on a token after she has watched a minute of its life.
pump.fun stream raydium-launchpad stream geyser stream
| | |
+----------+------------+--------+-----------------+
|
v
enricher
mint authority · mint meta · liquidity · holders · deployer · socials · first 60s
|
v
filter
heuristics + claude scoring
|
v
sinks
stdout · jsonl · webhook
the edge is verdict quality, not millisecond speed. naomi is meant to be slower than a sniper and more accurate than a scoreboard.
| source | status | notes |
|---|---|---|
| pump.fun token creation | 🟢 primary | program log subscription on 6EF8...wF6P |
| raydium-launchpad initialize/createPool | 🟢 primary | program log subscription on LanM...J3uj |
| raydium amm v4 post-graduation pools | ⚪ stub | watching for migrations from launchpad |
| geyser / yellowstone-grpc | 🟡 stub | wired in v0.3 once a stable ts client lands |
| feature | what it catches | status |
|---|---|---|
| mint authority | mint or freeze authority not renounced → ongoing rug surface | 🟢 v0.2 |
| mint metadata | decimals, supply, mutable metaplex meta | 🟡 v0.2 |
| liquidity / bonded pct | bonding-curve sol balance, graduation tracking | 🟡 v0.2 |
| top 10 holders | one wallet sells, you bag-hold | 🟡 v0.2 |
| deployer history | repeat offender: prior tokens deployed, wallet age | 🟡 v0.2 |
| social signals | twitter / telegram / website from metaplex meta | 🟡 v0.2 |
| first 60 seconds | unique buyers, jito-bundle dominance, sniper pubkeys, dev self-buy | 🟡 v0.2 |
| ai score | claude reads the full feature set, returns verdict | 🟢 v0.2 |
install from npm:
npm install -g naomi-scanner
# or one-shot:
npx naomi-scanneror from source:
git clone https://github.com/neomiagent/naomi.git
cd naomi
npm install
cp .env.example .env
cp config.example.yaml config.yaml
# fill in .env: SOL_RPC_URL, HELIUS_API_KEY, ANTHROPIC_API_KEY (optional)
npm run scanstdout will start emitting verdicts as new tokens are created on pump.fun and raydium-launchpad. naomi never signs a transaction; she only reads.
[ALERT] $WIF EPjFWdd5...kZwyTDt1v
score=82 liq=4.30sol top10=18% buyers60s=24 src=pumpfun
lp/curve healthy, authorities renounced, broad first-60s buyers, no jito dominance
[WATCH] $TROLL 5fBp...K1m
score=51 liq=1.80sol top10=42% buyers60s=11 src=raydium_launchpad [no_socials]
yellow: metaplex update authority active, no socials
[IGNORE] $RUG 7Hz...QqA
score=4 liq=0.20sol top10=88% buyers60s=2 src=pumpfun [dev_self_bought,top10_concentrated]
blocked: dev self-bought twice in first 60s, top wallet holds 88%
config.yaml controls filter strictness, sources, ai, and output sinks. .env holds endpoints and api keys. naomi reads no keys from anywhere else.
filter:
min_score: 0.2
alert_score: 0.7
reject:
mint_authority_not_renounced: true
freeze_authority_not_renounced: true
metadata_mutable: false
bonded_pct_below: 0
top10_holders_pct_above: 70
min_liquidity_sol: 5.0
first60s_unique_buyers_below: 3
dev_self_bought: true
sources:
pumpfun: true
raydium_launchpad: true
raydium_amm: false
geyser: false
ai:
enabled: true
prompt_cache: true
output:
stdout: true
jsonl_path: data/analyzed.jsonl
webhook_url:
webhook_min_verdict: watchsee config.example.yaml for the full reference.
src/
index.ts entrypoint and pipeline wiring
config.ts env and yaml loaders, zod-validated
types.ts shared types (TokenEvent, EnrichedToken, FilterDecision)
listener/
pumpfun.ts program log subscription on pump.fun
raydium_launchpad.ts program log subscription on raydium launchpad
geyser.ts yellowstone-grpc / shredstream stub
enricher/
index.ts parallel feature fetch
mint_authority.ts mint + freeze authority renunciation check
mint_meta.ts decimals, supply, metaplex metadata
liquidity.ts bonding-curve / pool reserves and bonded pct
holders.ts total holders, top10 concentration, first-slot count
deployer.ts prior tokens deployed, wallet age, balance at create
socials.ts twitter, telegram, website from metaplex
first_60s.ts the new scope tweak: 60s post-launch snapshot
ai/
filter.ts claude verdict, prompt-cached system, solana semantics
output/
stdout.ts colorized terminal verdicts
jsonl.ts one analyzed token per line, durable
webhook.ts POST verdicts above a configurable threshold
docs/
ARCHITECTURE.md deep dive
owners:
| zone | owners |
|---|---|
| core, config, ci, docs | @neomiagent |
| listeners (pumpfun, raydium-launchpad, geyser) | @0xnova |
| enricher, ai filter, scoring, first-60s | @senri |
| types, output sinks, cli | @kira |
- not a trading bot. she has no executor, no wallet, no signer. by design.
- not financial advice. verdicts are decision support, not commands.
- not a guarantee. authorities can be revoked post-launch, metaplex meta can flip, ai is wrong sometimes. read the flags.
- not multi-chain in this repo. solana mainnet only. the eth-era code lives at the v0.1.x tag — fork it under MIT if you want to keep that line alive.
| version | scope | status |
|---|---|---|
| v0.1 | (eth era) uniswap v2/v3 + mempool listeners, honeypot/contract/lp enrichers | archived |
| v0.2 | chain pivot to solana. pump.fun + raydium-launchpad listeners. first-60s snapshot. solana-shaped enrichers. claude prompt rewritten. | shipped |
| v0.3 | real geyser / yellowstone-grpc subscriber. helius enhanced-tx for first-60s and holders. metaplex metadata fetch. fixture replay. | now |
| v0.4 | meteora dlmm + raydium-clmm post-graduation tracking. discord webhook helper. historical replay mode. | planned |
| v0.5 | sniper-ring clustering (cross-token co-occurrence of buyer pubkeys). leaderboard. weekly digest. | planned |
prs welcome. read CONTRIBUTING.md first. good first contributions:
- wire a real geyser subscription in
src/listener/geyser.ts(helius hosted grpc is the easiest start) - implement
snapshotFirst60sagainst helius enhanced-tx parsed-instructions endpoint - add a metaplex metadata fetch in
src/enricher/mint_meta.ts - add a discord webhook formatter alongside the generic webhook sink
- add unit tests for the ai filter parser and the heuristic-only path
if you find a security issue, see SECURITY.md. do not open a public issue.
mit. see LICENSE.
solana, pump.fun, raydium, jito, helius, anthropic. the open-source ecosystem below the application layer is what makes this small.
built in public. if it's not in the repo, it doesn't exist.
v0.1.0 shipped 2026-04-25 (eth era). v0.2.0 shipped 2026-04-30 (chain pivot to solana).