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.
| EVENT | MEANING |
|---|---|
WAKE | a wallet past the SLEEP threshold signed something |
FOUND | a new sleeper crossed the threshold and joined the pool |
INFLOW | an already-awake tracked wallet added size |
TRIM | a tracked wallet reduced; subtracts from the desk |
NEW | a fresh market entered the universe |
MOVE | a live mark changed |
CAST | the walls were re-run against open context |
SYNC | a 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
| MODE | WHAT IT DOES |
|---|---|
LIVE | probes chain and market providers; clears the synthetic flag only if discovery resolved |
CACHED | boots instantly from the bootstrap set and stays usable offline |
NIGHT | high-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
| WALL | DEFAULT | WHAT IT ASKS |
|---|---|---|
SLEEP | >= 45d | was this wallet actually silent, or just slow? |
EDGE | DNA >= 55 | does the wallet have a record worth reading? |
SIZE | >= 0.35x median | is this a real ticket for this wallet? |
DEPTH | <= 3.00% | is the pool deep enough to absorb that ticket? |
PRICE | <= 900s | is 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.
04 · Commands
| COMMAND | WHAT IT DOES |
|---|---|
pellet terminal | two-pane interactive terminal · --night --live --for n |
pellet wake | scrolling wake feed · --cast-only --json --for n |
pellet flow | ranked smart desk · --top n --json |
pellet sleepers | who is still silent, longest first |
pellet wallet <handle> | one wallet read out |
pellet cough <handle> | write the pellet · --format md|json --output file |
pellet roost | local watchlist · add / remove |
pellet rules | the decision box · --set key=value |
pellet doctor | RPC, chain ID, providers, credentials · --probe |
pellet web | serve 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
| VARIABLE | PURPOSE |
|---|---|
PELLET_RPC_URL | custom HTTP(S) provider |
REPLYNODES_API_KEY | optional wallet-activity read credential |
FOMO_BEARER_TOKEN | alternative read credential |
PELLET_DATA_DIR | roost, rules and written pellets |
PORT | port 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.
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
lastActivestamp 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.
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.