Release Notes
Changelog and version history for X1.Ninja Screener
- FeatureShadow Feed — live trade terminal
New real-time trade feed at /terminal showing every XDEX swap as it happens. Features a cypherpunk-styled interface with buy/sell color coding, whale alerts (>$25), top trading pairs, active wallet rankings, and live buy/sell volume ratio — all derived from the Geyser stream with zero additional RPC load.
- ImprovementUpgraded to dedicated RPC infrastructure
All backend scripts and the web server now use a private RPC node as the primary endpoint, eliminating rate-limit failures that were causing empty holder data and stale prices during high-traffic periods.
- FixFixed bubble maps and holder data
Holder queries were returning empty for every token because the web server was hitting the rate-limited public RPC. Switching to the private validator RPC restored holder data, bubble maps, and safety scores across all 830+ pools.
- FeatureGlobal SSE trade stream
The /api/stream/trades endpoint now supports a global feed (pool=all) that streams every trade across all pools. Powers the Shadow Feed with no per-pool subscription needed.
- FixFixed real-time price updates for 527 pools
The Geyser consumer assumed on-chain vault ordering (token0Vault/token1Vault) matched base/quote token assignment, but XDEX doesn't guarantee this. 527 of 830 pools had swapped vault ordering, causing the Geyser pipeline to write inverted reserves and wildly wrong prices (e.g. ANAL showed $3,531 instead of $0.00004). The sync now stores explicit baseVault/quoteVault mappings, and the Geyser consumer uses role-based mapping instead of index-based.
- FixFixed pool reserve data accuracy in batch sync
The batch sync had the same vault ordering assumption — it assigned vault balances by index rather than by actual token mint. Reserves are now mapped by verifying each vault's on-chain mint. All 830 pool prices, liquidity, and LP data verified against on-chain within 0.03%.
- ImprovementBatch vault optimization — 20x faster sync
Pool sync now pre-fetches all vault balances in batches of 100 (17 RPC calls for 830 pools) instead of 830 individual calls. Combined with holder count caching, sync dropped from 20+ minutes (timing out) to ~8 minutes on warm runs.
- FixFixed candle aggregator skipping new pools
Pools indexed after their first trades permanently had empty charts because the candle aggregator applied a 48-hour lookback window. New pools with no prior watermark now aggregate all historical swaps on their first run, so charts appear immediately.
- FixProfile logos now override on-chain metadata
User-submitted profile images were being ignored because the API used them as a fallback only. Now the uploaded profile logo takes priority over the default IPFS mint logo.
- ImprovementColumn headers clarified
Screener table headers now show "Txns 24H" and "Vol 24H" instead of ambiguous "Txns" and "Vol".
- FeatureGeyser pipeline for instant price updates
Prices now update directly from the validator's Geyser plugin instead of polling public RPC. Vault balance changes stream in real-time through an SSH tunnel, giving sub-second price updates with zero RPC load. This eliminates the stale data issues caused by public RPC congestion.
- FeatureValidator SSH tunnel infrastructure
Persistent autossh tunnel to the private validator for RPC, WebSocket, and Geyser relay access. Auto-reconnects on drop, survives reboots via systemd. All ports bound to localhost only.
- ImprovementSEO overhaul: sitemap, robots.txt, canonical URLs
Added a dynamic sitemap.xml with 820+ URLs (all pool pages), robots.txt with crawl rules, and fixed canonical URLs on pair pages that were incorrectly pointing all 810 pages to the homepage.
- FixFixed stale trade display on pair pages
Trades now refresh immediately when switching back to the tab instead of waiting up to 60 seconds. Tightened polling intervals and added refetchOnWindowFocus to both trade and pool queries.
- FixResolved 13-hour sync outage
The batch sync pipeline hung overnight due to X1 public RPC instability — pool sync timed out 4 times, then the price poller got stuck on an unresponsive RPC call. Killed the stuck process and the Geyser pipeline now provides resilience against future RPC outages.
- FeatureNear-real-time price updates
Pool prices now update within seconds of each trade via the WebSocket pipeline, instead of waiting for the 16-22 minute batch sync cycle. Active pools show live prices on both the screener table and pair detail pages.
- FeatureDynamic SEO on pair pages
Sharing a pair link on Discord, Telegram, or Twitter now shows the token name, current price, 24h change, volume, and liquidity in the preview — instead of the generic site title.
- ImprovementPrice freshness indicator
The pair detail sidebar now shows "Updated X ago" with color coding: green (< 5 min), yellow (5-15 min), red (> 15 min). Auto-refreshes every 15 seconds.
- ImprovementCustom error and 404 pages
Broken pages now show a styled error screen with a retry button instead of white-screening. Invalid URLs and missing pools get dedicated 404 pages with navigation back to the screener.
- FixFixed Telegram bot crash loop
The approval bot was stuck in a 409-conflict restart loop due to duplicate PM2 daemon processes. Cleaned up zombie daemons, added a singleton guard to prevent duplicates, and increased shutdown timeout for clean Telegram session release.
- FixBlocked API spam and tightened rate limits
Blocked a persistent bot hammering a non-existent endpoint (/api/price/xnt) at the nginx level. Reduced API burst allowance from 60 to 20 requests.
- FeatureLP Pool Tool
New tool at /lp-tool to search any token and see all its pools with prices, reserves, and liquidity. Prices for non-standard pairs (e.g. FOREST/XUNI) are derived by looking up each token's price from their own XNT or USDC pools. Includes a cross-price calculator to compute the correct rate when initializing a new pair.
- FeatureCross-price calculator for new pool initialization
Pick any two tokens and get the calculated exchange rate routed through shared intermediaries (XNT, USDC, pXNT, rXNT). Shows confidence level based on liquidity depth, with a reserve calculator that tells you exactly how much of each token to deposit.
- FeatureToken price lookup across all pools
New /api/token-pools endpoint returns all pools for a token with derived USD prices — even for non-standard pairs where the pipeline shows $0. Paired token prices are looked up from their own pools in the system.
- FixFixed x1-web crash loop (500K+ restarts)
An orphaned Next.js process was holding port 3000, causing every PM2 restart to fail with EADDRINUSE. Added restart_delay and max_restarts to the PM2 config to prevent runaway restart loops.
- FixTop Gainers ticker loop fix
The scrolling marquee now loops seamlessly without visible jumps or gaps at the wrap point
- FeatureReal-time sidebar stats on pair pages
Price, volume, and trade counts in the sidebar now update instantly as trades stream in — no more waiting for the next poll cycle
- ImprovementFaster pair page data refresh (60s → 15s)
Pool stats now refresh 4x more frequently on pair pages, keeping the sidebar in sync with live activity
- ImprovementSmarter trade feed polling
When the live trade stream (SSE) is connected, redundant API polling backs off from 15s to 60s — reducing server load without affecting data freshness
- FixFixed refetch storms on tab switch
Switching browser tabs no longer triggers a burst of API requests across all active queries
- ImprovementTop Gainers ticker now derived from cached data
The scrolling ticker no longer makes its own API call when pool data is already loaded — cuts duplicate requests on the home page
- FeaturePrice Range ruler tool added to chart
New ruler drawing tool on the chart toolbar lets you measure price distance and percentage change between two points
- FixDeterministic trade history ordering
Trades with the same block timestamp now sort consistently by signature — fixes occasional row-shuffling in the transaction feed
- FixFixed watchlist hydration mismatch
Watchlist stars and badge counts no longer flash incorrectly on first page load
- FixImproved sticky table header on mobile
Table header stays visually anchored when scrolling horizontally on small screens
- ImprovementTelegram community link added to sidebar
- FixTransfer indexer now captures plain transfer instructions
Previously only transferChecked instructions were indexed — plain SPL transfer instructions are now resolved via token balance entries and captured as edges
- FixAMM filter relaxed from transaction-level to instruction-level
Mixed transactions containing both a swap and a separate wallet-to-wallet transfer no longer lose the transfer edge
- ImprovementX-Ray empty state now shows explanation instead of blank graph
Tokens with no transfers show a clear message distinguishing between "not yet indexed" and "no transfers found (AMM-only activity)"
- ImprovementRe-indexed all 413 tokens with improved parsing
All transfer index progress reset to re-scan with the new instruction-level filter and plain transfer support
- ImprovementCandle aggregator incremental rebuild
Only re-aggregates candle buckets affected by new swaps instead of the full 48h window — major ClickHouse CPU reduction
- ImprovementTrade indexer 4x faster batch processing
Reduced inter-batch sleep from 1s to 250ms with RPC rotation per batch to spread load across endpoints
- ImprovementWSS queue dedup now O(1) instead of O(n)
Signature dedup in the real-time trade queue uses a Set lookup instead of linear array scan
- FixFixed Telegram bot crash loop on restart
Bot now properly releases the Telegram polling session on shutdown, preventing 409 conflicts on restart
- FixRemoved dead RPC from trade indexer
Dead endpoint 51.195.104.145 was still in trade indexer RPC list, causing timeout waste every 5th batch
- FixLP burn detection now recognizes burnChecked
Safety score now detects LP tokens destroyed via SPL burnChecked instruction, not just tokens sent to burn addresses
- ImprovementHolder concentration scoring adjusted for small-cap tokens
Threshold widened from 50% to 80% — early-stage tokens now get partial credit instead of a flat zero
- FixHolder concentration now excludes DEX vaults and burn addresses
XDEX pool vaults, burn addresses, and system accounts are no longer counted as top holders in the safety score
- ImprovementMigrated CDN and token profile storage to gptree.vip
Token profile images now served from gptree.vip via Cloudflare R2
- FixFixed backup script failing on cron runs
SQLite, config, and remote sync backups were silently skipping since Feb 14 — now fully restored
- FixLP burn detection now recognizes partial burns
Safety score now shows actual burn percentage instead of binary pass/fail — pools with 50-90% LP burned get partial credit
- FixTransfer indexer batch retry on RPC failure
Failed transaction batches now retry on a different RPC instead of silently dropping transfers
- ImprovementX-Ray view now shows all holders as nodes
Holder bubbles are always visible in X-Ray, even when no wallet-to-wallet transfers exist
- FixX-Ray transfer graph now shows correct data per token
Fixed fallback that caused all unindexed tokens to display the same XNT transfer graph
- FixTransfer indexer now scans full token history
Scans up to 100k signatures per cycle per token, resuming deeper each cycle to reach initial distributions
- ImprovementTransfer indexer RPC split for reliable signature fetching
Archival RPC for signature history, fast validator RPCs for transaction data
- FixAMM-only pages no longer count against indexer scan limit
High-volume tokens with mostly swap activity are now scanned deeper to find actual transfers
- FixRemoved dead RPC endpoint from WSS and transfer indexer
- Feature
- FeatureX-Ray transfer graph with cluster detection
- FeatureWallet Inspector panel with flow analysis
- FeatureOn-demand transfer indexing
- FeatureHolder concentration metrics (Gini coefficient)
- ImprovementKnown address labels (DEX vaults, burn address, system program)
- ImprovementFullscreen mode for Bubble Map
- FeatureToken Safety Scanner with risk scoring
- FeatureTable sparklines for 24h price trends
- FeatureBiggest gainer ticker marquee
- FeatureChart timezone selection
- Feature
- FixWatchlist view preference now persists across reloads
- FixMobile table header alignment on horizontal scroll
- FixPool count display now shows true count beyond 500
- FeatureWallet portfolio tracker
Available at tools.x1.ninja/portfolio
- Feature
- FeatureTrade simulator widget
- ImprovementToken redirect pages
- FeatureReal-time trade streaming (WSS → Redis Streams → SSE)
- FeatureLive trade feed with green pulsing indicator
- ImprovementBuy/sell volume split in sidebar
- FeatureSite analytics (Umami integration)
- Feature
- FeatureTelegram ops bot with slash commands
- Feature
- FeatureStandalone candle aggregator
- Feature
- Feature
- ImprovementUI overhaul: sidebar branding, density improvements
