Skip to content

Methodology

How MuseCraft works

MuseCraft is a reader. Providers supply facts, deterministic code organizes them into findings, and an optional AI step explains the result. This page says exactly where each piece comes from and where it stops.

Data flow

Input → Validation → Retrieval → Normalization → Analysis → Explanation

  1. Validation. Addresses must be 42 characters of hex; mixed-case input must pass its EIP-55 checksum. Token IDs must fit in 256 bits. Tickers must look like US tickers. Invalid input is refused before any request is made.
  2. Retrieval. Every outbound request has a timeout, a response-size cap and a bounded number of retries. The RPC’s chain ID is verified before the first read, so a misconfigured endpoint cannot serve another chain’s data.
  3. One block per report. On-chain readers fetch the latest block once, then pin every call to that block number. Reads are batched as JSON-RPC, not through Multicall3, because on Arbitrum-style chains a contract sees the L1 block number. Indexed data from the explorer cannot be pinned and is labeled as such.
  4. Normalization. Provider responses are parsed against schemas. A response that does not match is treated as “unavailable”, never guessed at.
  5. Findings. Deterministic rules produce findings. Each one carries an observation, the evidence it cites, the method, the block, an interpretation and its limitations, and is tagged as current state, capability or not established.
  6. Explanation (optional). If a key is configured, the finished report can be sent to an AI model, which sees only that report. Names, metadata and source paths inside it are untrusted data, and the model is instructed to treat them as content, never as instructions. Its output is shown in a separate, clearly marked box.

Failed requests are shown as failures. MuseCraft has no mock or sample data path in the application: if a provider is down, the section says so.

Networks

What is supported, and how it was checked

Settings come from the official Robinhood Chain documentation (docs.robinhood.com/chain/connecting) and were confirmed by calling eth_chainId on each endpoint. A network is listed only when its integrations were seen working.

NetworkChain IDExplorerSource verificationMarket dataIndexer
Robinhood Chain4663robinhoodchain.blockscout.comSourcify v2GeckoTerminal, DexScreenerBlockscout (browser-side)
Robinhood Chain TestnetTestnet46630explorer.testnet.chain.robinhood.comSourcify v2None: testnet assets have no marketBlockscout (browser-side)

Why the indexer runs in your browser. The chain’s Blockscout explorer answers browsers but challenges server-side callers, so a server proxy would fail where a direct request works. When you load indexed data, your browser contacts the explorer directly and the explorer sees your IP address and the address you looked up. If it is unreachable, direct RPC reads still work and the indexed sections say they are unavailable. An empty indexer answer is never presented as proof of no activity.

Adding a network means adding one entry to src/config/networks.ts. Providers that do not cover it are set to null, and the matching features turn themselves off with an explanation.

On-chain readers

What each reader can and cannot establish

Contract Reader. Bytecode presence and hash, Sourcify verification, the EIP-1967 implementation, admin and beacon slots, the EIP-1167 clone pattern, ERC-165 detection, and a fixed set of standard probes. With a verified ABI it lists every view and pure function and calls them with eth_call. It never sends a transaction: the server re-derives the function from the verified ABI and refuses anything that is not read-only. A function named mint is reported as a capability, with the note that a name does not establish behavior. There is no safety score, and an unverified contract is never called safe.

NFT Reader. ERC-721 and ERC-1155, detected through ERC-165 first and by behavior second (and labeled “likely” in that case). ERC-1155 tokens are never given an owner: they have balances. The {id} placeholder is substituted with the 64-character lowercase hex ID. Metadata comes through a hardened fetcher and is displayed as text; images load through a same-origin proxy into an <img> element, where SVG scripts cannot run. External and animation URLs are shown as text, not loaded.

Coin Reader. ERC-20 fields from the chain. Pools from GeckoTerminal and DexScreener, matched by network and contract address only. The headline price is the deepest pool’s, and the page says so. FDV is price × total supply and is labeled as not being a market cap; no market cap is shown because circulating supply is not available for arbitrary tokens. Holder concentration appears only when the explorer’s index supplies holders. No honeypot or sell-ability claims are made.

Address Reader. Balance, code and nonce from RPC. Transactions, token balances, NFTs and transfers from the indexer, paginated. Approvals are found by scanning Approval logs over stated block ranges, then each one is re-verified with allowance() at the pinned block: an old event is never shown as a live approval, and the scanned range is always stated.

Security

Fetching untrusted URLs

NFT metadata and image URLs are attacker-controlled. The server-side fetcher accepts only https on the default port path, rejects credentials in URLs, single-label and internal host names, and any host that resolves to a private, loopback, link-local, CGNAT, multicast or cloud-metadata address (IPv4 and IPv6, including mapped and NAT64 forms). The connection is pinned to the validated IP so DNS rebinding cannot redirect it. Redirects are followed manually, at most three, each re-validated. Responses are capped (512 KB for metadata, 6 MB for images), time-limited to 8 seconds, and filtered by content type. Image responses carry a sandboxing Content-Security-Policy.

US stocks

Indicators

All indicators are computed on the server from the provider’s OHLCV bars. Prices are split-adjusted and not dividend-adjusted for every series, so quotes and bars are comparable. While the regular session is open, today’s still-forming daily bar is excluded from every calculation. If there are not enough bars for a lookback, the value is left blank instead of being approximated.

IndicatorFormulaNeeds
SMA nArithmetic mean of the last n closes.n closes
EMA nSeeded with the SMA of the first n values, then EMA = close × k + previous × (1 − k), k = 2 / (n + 1).n values
RSI 14Wilder’s method: first average gain and loss are simple means over 14 changes; later ones are smoothed with α = 1/14. RSI = 100 − 100 / (1 + avgGain / avgLoss).15 closes
ATR 14True range = max(high − low, |high − prior close|, |low − prior close|), smoothed with Wilder’s α = 1/14.15 bars
Realized volatility 20Sample standard deviation of the last 20 daily log returns × √252, in percent.21 closes
Relative volume 20Latest completed session’s volume ÷ mean volume of the 20 sessions before it.21 bars
Session VWAPΣ(typical price × volume) ÷ Σ volume over the current session’s 5-minute bars, typical price = (H + L + C) / 3.current session

Market sessions are computed in America/New_York using the time-zone database, with the published NYSE holiday and early-close calendar for 2026 and 2027. Outside those years the page says the calendar is unavailable. Charts key daily bars by session date and render intraday bars in Eastern Time without altering the underlying timestamps.

US stocks

The outlook: a documented vote, not a forecast

Each signal votes +1, 0 or −1 by a fixed rule. The bias is bullish when the average vote is at least +0.5, bearish at −0.5 or lower, and neutral otherwise. If fewer than 4 signals can be computed, no outlook is shown. The same bars always produce the same answer.

  • Near-term (next 1 to 5 sessions, daily bars, at least 30): close vs. SMA 10; close vs. SMA 20; RSI 14 above 55 or below 45; 5-session return beyond ±1%; closing location in the last session’s range on at least 1.2× average volume.
  • Swing (next 5 to 20 sessions, daily bars, at least 60): close vs. SMA 50; SMA 20 vs. SMA 50; close vs. SMA 200 (skipped with fewer than 200 bars); SMA 50 more than 0.2% above or below its value 10 sessions ago; RSI 14 above 55 or below 45; 20-session return beyond ±2%.
  • Intraday (rest of the session, 5-minute bars): price vs. session VWAP; price vs. the first 30 minutes’ range; EMA 9 vs. EMA 21; price vs. the open by ±0.25%. Offered only while the regular session is open, with at least 12 bars, and only if the newest bar closed no more than 20 minutes ago. Otherwise the page explains why it is withheld.

Reference levels (moving averages, the 20-session high and low, close ± 1 ATR) are arithmetic outputs used to describe the scenarios and their invalidation conditions. They are not entry, exit or stop instructions, and nothing here is personalized advice.

What is deliberately absent: win rates, accuracy figures, confidence percentages and probabilities. None has been measured. Before any such number could appear, it would need an out-of-sample evaluation with leakage controls (no look-ahead in signals, walk-forward splits, survivorship-free universe), comparison against simple baselines such as buy-and-hold and a coin flip, and a published method. The AI explanation is likewise forbidden from supplying prices, earnings dates, catalysts, targets or indicator values that are not in the report.

Operators

Setup

Every integration that needs a credential reads it from a server-side environment variable; none is exposed to the browser. See .env.example in the repository.

  • TWELVEDATA_API_KEY: licensed US stock data (a free key works). Set TWELVEDATA_ENTITLEMENT to realtime or delayed to match your plan; otherwise quote timing is labeled “not declared”. Without a key the stock workspace shows a configuration notice, never simulated prices.
  • ANTHROPIC_API_KEY: enables the optional explanation panel.
  • ROBINHOOD_RPC_URL: a dedicated RPC endpoint in place of the rate-limited public one.

Read this

Limitations

  • MuseCraft does not audit code. Verified source means the source is genuine, not that it is safe.
  • Names, symbols and metadata are self-reported by contracts and are frequently imitations. The contract address is the identifier.
  • Public RPC endpoints are rate limited and may refuse very wide log queries; approval scans state the range they actually covered.
  • Market data covers only venues the named providers index, and their prices carry no per-trade timestamp.
  • Rate limits and caches in MuseCraft are per server instance and exist for courtesy toward providers, not as a security boundary.
  • Recent searches and the watchlist are stored in your browser’s local storage: unencrypted, unsynced, and visible to anyone using the same browser profile. You can clear them from the desk.
  • Nothing on this site is investment, legal or tax advice.