Documentation
How each tab works, where the data comes from, and how calculations are performed.
Contents
BRL → USDC
Compare the true cost of buying USDC across Brazilian exchanges
How it works
For a given BRL amount, the dashboard fetches live prices from 7 exchanges and calculates the total USDC you'd receive after all fees — not just the exchange rate.
Calculation
The "total cost %" shown on each card is how much USDC you lose vs. a hypothetical perfect trade at the Coinbase mid-market rate with zero fees.
Exchanges tracked
| Exchange | Pair | Fee | Withdrawal |
|---|---|---|---|
| Binance | USDC/BRL | 0.075% | 0.30 USDC (BSC) |
| Bitybank | USDC/BRL | 0.20% | Free (Solana) |
| Bitso | USDT/BRL | 0.40% | 5 USDT (ERC-20) |
| Foxbit | USDC/BRL | ~0.50% | 1 USDC (ERC-20) |
| Mercado Bitcoin | USDC/BRL | 0.70% | 1 USDC (Polygon) |
| NovaDAX | USDC/BRL | 0.45% | 1 USDC (Polygon) |
| Wise | BRL/USD | ~1.3% + 0.38% IOF | Free (Base) |
Coinbase spot rate is used as the mid-market reference only — not included in the ranking since its quoted rate doesn't reflect what you'd actually pay after their spread and fees. Wise is a wire transfer service (BRL → USD → mint USDC), not a crypto exchange — it's included because the end result is the same: USDC in your wallet.
News Sentiment
Crypto news sentiment scored by FinBERT, overlaid with BTC price
Pipeline
Sentiment score
FinBERT outputs three probabilities for each headline: P(positive), P(negative), P(neutral). The raw score ranges from -1 to +1 and is rescaled to 0–100 for display.
display_score = (raw_score + 1) × 50 ∈ [0, 100]
Historical data includes ~37,000 headlines going back to May 2024. Only English-language crypto news is scored — the model does not capture sentiment from social media, forums, or non-English sources.
Fear & Greed gauge
The gauge shows a 7-day moving average of the daily sentiment score. It's a simple sentiment-derived analog of the popular Fear & Greed Index, based purely on news tone rather than market indicators.
What's on the chart
Main chart (top): Daily sentiment score (0–100) as an area chart, with 7-day and 30-day moving averages. BTC price is plotted on a secondary axis for visual correlation.
Volume bars (bottom): Number of headlines per day, colored green/red based on whether sentiment was above or below 50.
Headlines feed: Most recent headlines with their individual sentiment scores and source.
Beta Analyzer
Measure altcoin volatility relative to Bitcoin
What is Beta?
Beta (β) measures how much an altcoin moves relative to Bitcoin. It's the slope of a linear regression of the altcoin's daily returns against Bitcoin's daily returns.
Step-by-step calculation
Formulas
R² close to 1 means BTC explains most of the altcoin's movement. R² close to 0 means the altcoin moves independently.
Limitations
Simple returns, not log returns. The calculation uses arithmetic daily returns (price change / previous price) rather than logarithmic returns. For typical daily crypto moves (<5%), the difference is negligible. For extreme days (+20%), simple returns slightly overstate volatility.
Rolling window is fixed at 30 days. This captures short-term regime changes well but can be noisy. A longer window (60–90d) would be smoother but slower to react to shifts in market behavior.
Only two altcoins. SOL and ETH are included because they have deep, reliable price history. Other altcoins could be added but may have thinner data or gaps that distort the regression.
Mayer Multiple
Price / 200-day moving average — a long-term valuation signal
How it works
Zone interpretation
Popularized by Trace Mayer. The 200-day MA is a widely-watched trend indicator in traditional finance. The multiple tells you how stretched the price is relative to its long-term trend. Note that the zone thresholds are based on BTC's historical cycles — they may not apply directly to ETH or SOL, which have shorter histories and different market dynamics.
MVRV Ratio
Market Value to Realized Value — on-chain valuation metric
What is MVRV?
MVRV compares two ways of measuring a blockchain's total value:
When MVRV is high, the average holder is sitting on large unrealized gains — historically a signal that profit-taking may be near. When MVRV is below 1, the average holder is underwater.
Zone interpretation
Data source
MVRV data comes from the CoinMetrics Community API (free, no API key). They compute realized cap by tracking every coin's on-chain movement — via UTXOs for BTC and account state for ETH. Available for BTC since July 2010 (~5,700 daily data points) and ETH since August 2015 (~3,900 points). SOL is not available on CoinMetrics' free tier.
Data Pipeline
How data is fetched, stored, and served
Data sources
| Source | What | Refresh |
|---|---|---|
| Exchange APIs | Live USDC/BRL ask/bid from 7 exchanges + Coinbase reference | Every page load (5 min ISR cache) |
| CoinGecko | Daily prices for 7 coins (seeded at 365d, grows over time) | Hourly cron, fetches 7-day window and merges |
| CryptoCompare | Daily prices for BTC, ETH, SOL (seeded at 2000d, grows over time) | Hourly cron, fetches 30-day window and merges |
| CoinMetrics | MVRV ratio for BTC (since 2010) and ETH (since 2015) | Hourly cron, appends only new days |
| Sentiment pipeline | ~37K headlines from 6 RSS sources + BTC price + FinBERT scores | Daily at 1 AM ET via systemd timer |
Storage strategy
All market data is stored as local JSON files. Fetches are incremental — existing data is preserved and only new or recent data points are fetched and merged.
Price data (CoinGecko, CryptoCompare): Stored as [[timestamp_ms, price], ...] arrays. Deduplication is done by normalizing timestamps to calendar dates — if two entries fall on the same day, the newer fetch wins. History grows indefinitely beyond the API's rolling window.
MVRV data (CoinMetrics): Stored as {date, mvrv} objects. The API supports start_time, so we only request days after our last entry. No dedup needed.
Sentiment data: Stored in SQLite. The daily pipeline scrapes, scores, and inserts. No overwrites.
What happens on page load
The page is statically generated by Next.js and revalidated every 5 minutes (ISR). When you visit, all tab components mount and fire their data fetches in parallel:
| Tab | API calls | Reads from |
|---|---|---|
| BRL → USDC | /api/rates | Live exchange APIs |
| Sentiment | /api/sentiment/* (3 calls) | Local SQLite DB |
| Beta | /api/coingecko (2 calls) | Local JSON files |
| Mayer Multiple | /api/coingecko (1 call) | Local JSON files |
| MVRV | /api/mvrv (1 call) | Local JSON files |
Except for the exchange rates API (which hits live external APIs), every call reads from local storage. No external API calls are made on page load.
Built by Lucas · Data from CoinGecko, CryptoCompare, CoinMetrics, and FinBERT