volat-screener
v1.0.0
Published
Interactive CLI for screening volatile cryptocurrencies across exchanges.
Maintainers
Readme
volat
Interactive TypeScript CLI for finding high-volatility crypto assets across configurable market-cap ranges and exchange filters.
The CLI is designed for arbitrage and market-scanning workflows:
- step-by-step terminal wizard with
@clack/prompts - provider-based market data architecture
- exchange-aware screening
- optional CSV export
Installation
Requirements
- Node.js
20+ - npm
Local Development
npm install
npm run startOn first launch, volat opens a setup wizard and asks for the provider API keys it needs. The values are saved in the user config directory via conf and reused on later runs.
If you prefer environment variables instead of saved local config, copy .env.example to .env and fill in only the providers you plan to use.
Launching As volat
For local development on your machine:
npm run build
npm link
volatAfter publishing to npm, users will be able to run it without cloning the repository:
npm install -g volat
volator:
npx volatTo open the saved credential manager later:
volat configUseful Scripts
npm run start
npm run dev
npm run typecheck
npm run buildConfiguration
Environment variables are defined in .env.example.
Supported Variables
COINGECKO_API_KEY=your_coingecko_api_key_here
COINGECKO_API_PLAN=demo
COINMARKETCAP_API_KEY=your_coinmarketcap_api_key_hereCredential Priority
The CLI resolves provider credentials in this order:
- environment variables
- persistent local config saved by
volat config - manual setup wizard input
Persistent config is stored with the conf library in the system default user config directory.
Notes
COINGECKO_API_KEYis required if you use theCoinGeckoprovider.COINGECKO_API_PLANmust bedemoorpro.COINMARKETCAP_API_KEYis required if you use theCoinMarketCapprovider.- With the current implementation,
CoinGeckomust be included for full screening because it provides the 24h high/low and exchange ticker data needed by the volatility and exchange filters. CoinMarketCapcurrently contributes additional market data into the merged provider result set, but does not currently satisfy all filter requirements on its own.- If no usable credentials are found at startup,
volatopens a one-time setup wizard and saves the values for future runs. - Running
volat configopens the credential wizard again so users can rotate keys or add providers later.
Runtime Flow
When you run the CLI, you will be prompted for:
- market data providers
- market-cap rank range
- minimum volatility threshold
- result count
- target exchanges
- exchange match mode:
anyorall - optional CSV export after results are shown
Adding New Providers
The project is structured so new providers can be added without rewriting the screening engine.
Provider Contract
Every provider must implement the MarketDataConnector interface in src/types/index.ts.
A provider is expected to expose:
idlabelsupportsVolatilityDatasupportsExchangeTickersfetchCoinsForRankRange(config)fetchCoinTickers(coinId, exchangeIds?)
Where to Add a Provider
Create a connector in
src/providers/. Example:src/providers/coingecko.tsRegister it in
src/providers/index.tsAdd its selectable metadata to
src/constants.tsAdd any provider-specific environment handling in
src/env.ts
Data Model Expectations
Providers should normalize external API responses into:
MarketCoinCoinTicker
These shared types live in src/types/index.ts.
If multiple providers return the same asset, the app merges them in src/aggregation.ts:
- one coin appears only once in results
- numeric fields are averaged across providers
- source provider metadata is preserved
Exchange Configuration
Exchange options and provider-specific exchange aliases are defined in src/config/exchanges.ts.
If you need to:
- add a new selectable exchange
- fix provider-specific exchange ids
- normalize naming mismatches such as
OKXvsokex
this is the single place to update.
Screening Rules
Core screening logic is isolated in src/engine/ScreenerEngine.ts.
This includes:
- stablecoin filtering
- volatility calculation
- minimum volume filtering
- exchange matching logic
- top-exchange extraction
Project Structure
src/
config/
exchanges.ts
engine/
ScreenerEngine.ts
providers/
coingecko.ts
coinmarketcap.ts
index.ts
types/
index.ts
aggregation.ts
enrichment.ts
export.ts
prompts.ts
table.ts
app.ts
index.tsDevelopment
Before opening a pull request, at minimum run:
npm run typecheckIf you add a new provider or exchange mapping, keep the following aligned:
