// DOCUMENTATION

READ IT, THEN RUN IT.

PELLET is a CLI-first wake terminal for Robinhood Chain. It watches wallets that went quiet, pushes every wake through five readable walls, and keeps a rolling desk of where tracked money actually went.

01 · Quickstart

Node 20 or newer. No build step, no dependencies.

git clone https://github.com/0xwast3/pellet.git
cd pellet
npm install
cp .env.example .env
npm run doctor

Install it as a local command if you would rather type pellet:

npm install -g .
pellet doctor --probe

Sixty seconds

npm start      # two-pane terminal
npm run wake   # raw scrolling feed
npm run flow   # ranked desk, then exit
npm run night  # high-cadence, for recording
npm run web    # this site, served locally, on live data

Public mode runs with no secret at all. A read credential is optional and only replaces the tracked wallet pool.

02 · Terminal

Three things stay on screen at once: the stream, the reasoning for the selected row, and the desk. Nothing you need to make a call hides behind a keystroke.

EVENTMEANING
WAKEa wallet past the SLEEP threshold signed something
FOUNDa new sleeper crossed the threshold and joined the pool
INFLOWan already-awake tracked wallet added size
TRIMa tracked wallet reduced; subtracts from the desk
NEWa fresh market entered the universe
MOVEa live mark changed
CASTthe walls were re-run against open context
SYNCa provider refresh or a local write completed

Keys

↑ ↓ move · f cycle ALL → CAST → PASS → WAKE · w wakes only · space roost · c cough a pellet · p pause · r refresh · q quit

The owl in the header blinks on alternate frames. If it stops blinking, the stream is paused.

Checking a wallet

In the CLI, pellet wallet <handle> reads one wallet out and pellet cough <handle> writes its full record. The web terminal puts the same thing behind a click: every handle in the stream opens a wallet pane with the record, the dormancy against the threshold, which wall refused it and how often, the tokens it touched and its trail.

Modes

MODEWHAT IT DOES
LIVEprobes chain and market providers; clears the synthetic flag only if discovery resolved
CACHEDboots instantly from the bootstrap set and stays usable offline
NIGHThigh-cadence stream for recordings and screenshares

Cached and night rows are generated from the bootstrap set, and they say so — in the header, in every event object, and in every exported pellet. A screenshot and a file cannot disagree about where a number came from.

03 · Strategy

Why dormancy is the filter

An active wallet trades constantly, so any one of its entries carries almost no information. A wallet silent for a year that then signs something has made a decision, not followed a habit. The silence is the signal, and it costs one timestamp per wallet to measure.

The walls

WALLDEFAULTWHAT IT ASKS
SLEEP>= 45dwas this wallet actually silent, or just slow?
EDGEDNA >= 55does the wallet have a record worth reading?
SIZE>= 0.35x medianis this a real ticket for this wallet?
DEPTH<= 3.00%is the pool deep enough to absorb that ticket?
PRICE<= 900sis there a fresh mark to read the entry against?

SIZE is relative on purpose

A 4 ETH ticket is enormous for a wallet whose median is 0.05 and unremarkable for one whose median is 6. Absolute thresholds tell you which wallets are rich. Relative thresholds tell you which wallets are serious.

SLEEP is not silently passed

An inflow from a wallet that never went quiet is still worth ranking on the desk, but it is not a wake. Rather than passing SLEEP quietly, the trace records it as N/A. You always know which of the two you are looking at.

Unknown is not zero

If liquidity cannot be read, DEPTH returns UNKNOWN and the candidate is refused. It does not quietly become 0% and pass. Every refusal names its wall, including the ones caused by missing data.

The flow desk

Per token inside a rolling window: net USD in minus out, the number of distinct tracked wallets, ticket count, average ticket and a cumulative sparkline. Net flow is the headline; the wallet count is the guard. Reductions subtract, so a token can rank negative — that is a result, not a gap.

Try the wall simulator →

04 · Commands

COMMANDWHAT IT DOES
pellet terminaltwo-pane interactive terminal · --night --live --for n
pellet wakescrolling wake feed · --cast-only --json --for n
pellet flowranked smart desk · --top n --json
pellet sleeperswho is still silent, longest first
pellet wallet <handle>one wallet read out
pellet cough <handle>write the pellet · --format md|json --output file
pellet roostlocal watchlist · add / remove
pellet rulesthe decision box · --set key=value
pellet doctorRPC, chain ID, providers, credentials · --probe
pellet webserve this site locally against the live runtime

Tuning the box

pellet rules --set sleepDays=90
pellet rules --set maxImpact=0.015
pellet rules --set minFlowWallets=4

Valid keys: sleepDays, minDna, sizeRatio, maxImpact, maxMarkAgeSec, flowWindowMin, minFlowWallets, roostLimit.

Environment

VARIABLEPURPOSE
PELLET_RPC_URLcustom HTTP(S) provider
REPLYNODES_API_KEYoptional wallet-activity read credential
FOMO_BEARER_TOKENalternative read credential
PELLET_DATA_DIRroost, rules and written pellets
PORTport for pellet web

05 · The pellet

An owl swallows its prey whole and coughs up a pellet: a dry, readable record of everything it ate, bones included. Nothing is digested away.

pellet cough night_porter --format md --output porter.md

One wallet, brought back up whole: score, trades, win rate, median ticket, realized, dormancy, everything it was observed doing this session, which wall refused it and how often, and a twenty-row trail with the reason attached to each row.

Fields the runtime could not observe are null, never 0. Rows produced by a synthetic stream carry the flag into the file, so an exported pellet and a screenshot cannot disagree.

Read one on the landing page →

06 · Architecture

One Node process, no database, no daemon. It holds three things in memory and writes only small files to disk.

data/seed.json          bootstrap set — cold start and offline runs
.pellet/runtime.json    local rules and roost, written atomically
.pellet/pellet-*.json   pellets written from the terminal with c

The three structures

  • Token universe — grows during the session as discovery returns symbols it has not seen. It never shrinks, so a token that stops being returned keeps its last mark and ages out of PRICE instead of vanishing from the screen.
  • Wallet pool — keyed by handle, each with a lastActive stamp that dormancy derives from. A discovery pass adds wallets crossing the threshold, so a long session keeps finding new sleepers rather than draining.
  • Flow window — per token, net USD, the set of distinct wallets, ticket count and a sparkline. The set is what stops one wallet cycling a position from looking like conviction.

One implementation of the walls

src/core/walls.mjs is pure: no imports, no I/O, no clock of its own. The CLI imports it and so does this website. A verdict shown here is the verdict the terminal would print, because it is the same file.

Providers

src/providers/http.mjs is the only place fetch is called. Hard timeout, no retries, never throws upward — every provider returns a result object with an error field. The wallet provider does not merge live and bootstrap rows: you are looking at one pool or the other, and the header says which.

The PELLET pipeline

07 · Safety

What PELLET does not do

  • It does not connect a wallet — not in the CLI, not on this site.
  • It does not sign, send, or queue transactions.
  • It does not hold, read or ask for a private key or seed phrase. No code path in the repository accepts one.
  • It does not rate token safety, predict price, or tell you to buy anything.

Before you act on a screen

A wake is not an endorsement. A wallet with a strong record waking up on a token is one observation. It does not mean the wallet is right, that it is not exiting, or that it has not been compromised.

A cleared wall set is not a recommendation. CAST means five specific conditions held at one moment. It says nothing about whether entering was a good idea.

Believe the synthetic label. On a static host there is no chain to read, so every row on this site is generated from the bootstrap set. Do not trade a screenshot without checking which mode produced it.

Credentials

The optional read credentials are read-only leaderboard keys. Keep them in .env, which is gitignored, and never in a screenshot. pellet doctor reports only whether a credential is present, never its value.